
在程序开发中我们经常看见有一些软件左侧有目录树或者是图层树,点击之后就可以右侧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;
-
-
-
- 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);
-
-
-
-
-
- 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();
-
-
- 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;
-
- }
最后,为了防止报错,在
CDockDialog头文件中添加#include "resource.h"
最后即可编译成功

转自http://blog.youkuaiyun.com/hw140701/article/details/69382284