最近在做一个MDI项目,需要用到一个带TreeCtrl的能dock的控件。坦白的说,由于是第一次做基于MDI的项目,所以一切都需要搜索。
在网上搜了一堆类似的控件,要么是用Cristi Posea在1998年写的一个类CSizingControlBar,要么是基于MFC的CDialogBar。
但是我是在VS2010上开发的,在函数DockControlBar(&m_wndMyDlgBar)时,会遇到类似如下错误:
vc7libs\ship\atlmfc\src\mfc\winfrm2.cpp Line:91
不知道为啥。后来在网上搜了一遍,发现是因为CDialogBar在VS2010上使用会有问题(具体原因还没查清楚)。
换一个方法来做:
- 在类视图中添加MFC类,基于CDockablePane,比如取名叫CMyDP。
- 在资源视图中添加一个IDD_FORMVIEW。因为是实验,所以这里ID暂时不改。属性用默认即可。
- 基于该对话框资源,添加一个类,比如叫CMyFV。这个对话框是放在CMyDP里的,否则CMyDP中不会显示任何内容。
- 在CMyDP类中添加一个CMyFV的变量,比如叫m_fv。
在CMyDP类中添加ON_WM_CREATE消息映射,并在OnCreate中创建m_fv:
if (!m_projDlg.Create(IDD_PROJVIEW,this))
{
TRACE0("未能创建输出选项卡窗口/n");
return -1; // 未能创建
}
m_projDlg.ShowWindow(SW_SHOW);
- MainFrame中添加一个CMyDP的变量m_cmydp,并在OnCreate函数中创建:
if (!m_cmydp.Create(_T("MyPane"), this, CRect(0, 0, 100, 100),
TRUE, IDD_FORMVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
| WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))
{
TRACE0("未能创建输出窗口/n");
return FALSE;
}
m_cmydp.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_cmydp);
注意是使用DockPane而不是DockControlBar了。
其余的部分就自己去完善吧。