CDockablePane类可以用来创建停靠栏。可以将其他控件集成到CDockablePane的派生类中。本文描述如何将对话框集成到CDockablePane中。集成其他控件的方式类似。
1、首先创建多文档应用程序,创建一个对话框类CTestDlg。
2、在程序添加一个停靠栏类,名为ControlPanel,其父类为CDockablePane,在该类中添加对话框成员。
需要将对话框的style设置为child。另外border设置为none的话,得到的界面看上去会更主流一点。
1: class ControlPanel : public CDockablePane
2: {
3: .....
4: public:
5: CTestDlg m_dlg;
6: };
3、在ControlPanel的OnCreate方法中创建并显示对话框。
1: int ControlPanel::OnCreate(LPCREATESTRUCT lpCreateStruct)
2: {
3: if (CDockablePane::OnCreate(lpCreateStruct) == -1)
4: return -1;
5:
6: // TODO: Add your specialized creation code here
7:
8: m_dlg.Create(IDD_DIALOG_TEST,this);
9: m_dlg.ShowWindow(SW_SHOW);
10: return 0;
11: }
4、ControlPanel销毁时,对话框也销毁掉:
1: void ControlPanel::OnDestroy()
2: {
3: CDockablePane::OnDestroy();
4:
5: // TODO: Add your message handler code here
6: m_dlg.DestroyWindow();
7: }
5、ControlPanel尺寸变化、隐藏的时候,对话框也要做相关处理:
1: void ControlPanel::OnSize(UINT nType, int cx, int cy)
2: {
3: CDockablePane::OnSize(nType, cx, cy);
4:
5: // TODO: Add your message handler code here
6: if(m_dlg.GetSafeHwnd())
7: {
8: CRect rct;
9: GetClientRect(rct);
10: m_dlg.MoveWindow(rct);
11: }
12: }
6、在框架类中添加ControlPanel成员:
1: class CMainFrame : public CMDIFrameWndEx
2: {
3: ...
4: ControlPanel m_Panel;
5: ...
6: };
7、在框架类创建时,创建这个ControlPanel对象:
Create函数里面的666是这个停靠栏的ID,这里是随便指定的一个数值,只要不和其他已用资源重复即可,真正应用的时候,以在字符串表中添加一个ID。
1: int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
2: {
3: ...
4: m_Panel.Create(_T("tset"),this,CRect(0,0,300,300),TRUE,666,
5: WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI);
6: m_Panel.EnableDocking(CBRS_ALIGN_ANY);
7:
8: EnableDocking(CBRS_ALIGN_ANY);
9: DockPane(&m_Panel);
10: ...
11: }
编译运行后,可以发现框架中添加了一个停靠栏,之前创建的那个对话框嵌入在里面。