VS2010-MFC:单文档左侧可停靠对话框(包含树控件)的实现

    xiaoxiao2021-03-25  33

    在程序开发中我们经常看见有一些软件左侧有目录树或者是图层树,点击之后就可以右侧View窗口显示相关的内容,其实实现这种机制有两种方法,第一种就是对MFC的View窗口进行窗口分割,左侧的窗口view类派生于CTreeView,其中CTreeView自带一个变量用于View中的树控件的控制。第二种方法就是用一个可停靠的面板嵌套一个对话框,再在对话框中添加树控件,同样可以达到相同的目的。

    以下详解搭建步骤:

    第一步:在VS2010中生成一个MFC经典风格的单文档程序,命名为CMyTestMFCDlg,编译下保证没有出错。

    第二步:为该工程添加一个新类CMyDockablePane,派生于CDockablePane。

    第三步:新建上述类完成后,在CMainFrame头文件中包含该类的头文件#include "MyDockablePane.h"

       声明该类的对象:

     

    public: CMyDockablePane m_MyDockablePane;

    然后在CMainFrame的CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中创建可停靠面板

     

     

    创建可停靠对话框 if (!m_MyDockablePane.Create(_T("图层"), this, CRect(0, 0, 200, 200), TRUE, 1001, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI)) { TRACE0("Failed to create LeftPane\n"); return -1; } m_MyDockablePane.EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_MyDockablePane);

     

     

    编译运行:

    第四步:插入一个新的对话框,命名为IDD_DIALOG_DOCKDIALOG,在对话框属性中将Style设为Child,Border设为None。

    为该对话框新建类:CDockDialog,基类为CDialogEx。

    添加一个树控件,IDC_TREE_Test,为树控件关联一个控件变量m_TreeControl

    在MyDockablePane.h中包含头文件#include "DockDialog.h"

    添加CDockDialog 类的成员变量:CDockDialog m_TestDlg;

    添加CMyDockablePane的WM_CREATE和WM_SIZE消息响应函数

    在函数中添加以下代码

     

    int CMyDockablePane::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDockablePane::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 /*-----------面板初始化创建对话框-------------*/ CRect rectDummy; rectDummy.SetRectEmpty(); // 创建选项卡窗口: if (!m_TestDlg.Create(IDD_DIALOG_DOCKDIALOG,this)) { TRACE0("未能创建输出选项卡窗口/n"); return-1; // 未能创建 } m_TestDlg.ShowWindow(SW_SHOW); /*------------------------------------------*/ return 0; }

     

     

     

     

     

    void CMyDockablePane::OnSize(UINT nType, int cx, int cy) { CDockablePane::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 // 选项卡控件应覆盖整个工作区 /*---------------------------------------------------------------------------------------*/ m_TestDlg.SetWindowPos (this, -1, -1, cx, cy, SWP_NOMOVE |SWP_NOACTIVATE | SWP_NOZORDER); m_TestDlg.ShowWindow(SW_SHOW); /*---------------------------------------------------------------------------------------*/ }

    第五步:在CDockDialog类中重载虚函数OnInitDialog(),添加以下代码初始化树控件

     

     

    BOOL CDockDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 HTREEITEM rootItem = m_TreeControl.InsertItem(TEXT("根节点"), 0, 0, NULL); HTREEITEM parentItem = m_TreeControl.InsertItem(TEXT("父节点"), 1, 1, rootItem); HTREEITEM subItem1 = m_TreeControl.InsertItem(TEXT("子节点"), 2, 2, parentItem); HTREEITEM subItem2 = m_TreeControl.InsertItem(TEXT("子节点"), 2, 2, parentItem); m_TreeControl.SelectItem(subItem2); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }

    最后,为了防止报错,在CDockDialog头文件中添加#include "resource.h"

     

     

    最后即可编译成功

     

    如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。

     

     

     

     

    HW140701 认证博客专家 博客砖家 拥有C/C++超过5年开发经验。C/C艹、计算机图形学、三维重建、图形渲染等一生之敌。高中是文科生,本科、研究生是理科生,有机会读博士我想选工科!博客基本上都是写给自己备完的,不喜勿喷。
    转载请注明原文地址: https://ju.6miu.com/read-150197.html

    最新回复(0)