使用CDockablePane类创建模型树停靠窗口
新建一个带有功能区(Ribbon)的单文档应用程序;在新建过程中,选中图1、2、3中红色箭头所指选项即可。
1. 在“资源视图”中找到“Dialog”,右击选择“插入Dialog(E)”,将“工具箱”中的“Tree Control”拖至创建的Dialog(对话框)上,并将模型树控件与对话框的属性改为图4所示;
2. 右击对话框,为对话框添加类CTreeWindow;
3. 右击模型树控件,为其添加CTreeCtrl类型变量m_cTreeCtrl;
4. 重写该对话框类的初始化函数OnInitDialog(),在该函数中添加如下代码:
//往模型树插入节点
HTREEITEM hTreeItem = m_cTreeCtrl.InsertItem(_T("a tree"));
for (int i = 1; i <= 20; i++)
{
CString bough;
bough.Format(_T("a bough%d"), i);
m_cTreeCtrl.InsertItem(bough, hTreeItem);
}
m_cTreeCtrl.Expand(hTreeItem, TVE_EXPAND);//设置模型树节点hTreeItem为展开状态
5. 右击项目,选择“类向导(Z…)”,创建类CTreeWindowDock,其父类为CDockablePane,如图5所示;
6. 在CTreeWindowDock.h中添加头文件Treewindow.h与停靠窗口变量CTreeWindow m_TreeBaseWind;
7. 重写类CTreeWindowDock的WM_CREATE、WM_SIZE、WM_DESTROY消息函数,对应消息处理函数的函数实现如下:
int CTreeWindowDock::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
//模型树窗口创建
if (!m_TreeBaseWind.Create(IDD_TREEWINDOW, this))
{
TRACE0("未能创建模型树窗口!");
return -1;
}
m_TreeBaseWind.ShowWindow(SW_SHOW);
return 0;
}
void CTreeWindowDock::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
//使窗口随着停靠框架大小变化而变化
if (m_TreeBaseWind.GetSafeHwnd())
{
CRect rect;
GetClientRect(rect);
m_TreeBaseWind.MoveWindow(rect);
}
}
void CTreeWindowDock::OnDestroy()
{
CDockablePane::OnDestroy();
// TODO: 在此处添加消息处理程序代码
//销毁窗口
m_TreeBaseWind.DestroyWindow();
}
8. 在MainFrm.h中添加头文件TreeWindowDock.h与变量CTreeWindowDock m_TreeWindDock;并添加函数申明bool CreateDockingWindows();
9. 在MainFrm.cpp中的OnCreate()函数中添加如下代码:
//创建停靠窗口
EnableLoadDockState(FALSE); //删除停靠窗口的记忆功能
if (!CreateDockingWindows())
{
TRACE0("未能创建输出窗口/n");
return FALSE;
}
m_TreeWindDock.EnableDocking(CBRS_ALIGN_ANY); //使可停靠与浮动
DockPane(&m_TreeWindDock);
10. 在MainFrm.cpp中添加CreateDockingWindows()的函数实现,如下所示:
bool CMainFrame::CreateDockingWindows()
{
//左侧创建树形控件停靠窗口
m_TreeWindDock.Create(_T("模型树"), this, CRect(0, 0, 250, 200), TRUE, IDD_TREEWINDOW,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI,
AFX_CBRS_REGULAR_TABS, AFX_CBRS_FLOAT | AFX_CBRS_AUTOHIDE | AFX_CBRS_RESIZE);
//AFX_CBRS_REGULAR_TABS, AFX_CBRS_FLOAT | AFX_CBRS_AUTOHIDE| AFX_CBRS_RESIZE 的目的是去除关闭按钮
return true;
}
若出现图6所示的错误:未定义标识符 “IDD_TREEWINDOW”,只需在Treewindow.h中包含资源头文件Resource.h即可。