文章为网上一网友写的,自己实际参考并运行,加入了自己的一点感悟,仅供学习、测试及参考,不对之处还请指正,共同学习~~
编译工具:VS2010
内容一:新建一个CDockablePane派生类。
新建一个单文档
从CDockablePane派生出一个Pane类
在MainFrm中加入:
Pane pane;
在MainFrm的OnCreate的方法中加入
// TODO: 在此添加您专用的创建代码
if (!pane.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;
}
pane.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&pane);
在BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)与END_MESSAGE_MAP()中间加入
ON_WM_CREATE()
运行得到:
注释:自己测试面板显示和隐藏时会出现重影,这是正常的表现,因为面板里面没有任何显示的内容,也无添加任何响应事件
CDockablePane类可以用来创建停靠栏。可以将其他控件集成到CDockablePane的派生类中。本文描述如何将对话框集成到CDockablePane中。集成其他控件的方式类似。
1、首先创建多文档应用程序,创建一个对话框类CTestDlg。
2、在程序添加一个停靠栏类,名为ControlPanel,其父类为CDockablePane,在该类中添加对话框成员。
需要将对话框的style设置为child。另外border设置为none的话,得到的界面看上去会更主流一点。
1: class ControlPanel : public CDockablePane
2: {
3: .....
4: public:
5: CTestDlg 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: dlg.Create(IDD_DIALOG_TEST,this);
9: 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: 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: 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: {
.....m_Panel.Create(_T("MyTest Panel"),this,CRect(0,0,300,300),TRUE,10010,WS_CHILD| WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_LEFT|CBRS_FLOAT_MULTI);
m_Panel.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_Panel);
.....
11: }
编译运行后,可以发现框架中添加了一个停靠栏,之前创建的那个对话框嵌入在里面。(读者可以自己在面板对话框中添加一个按钮,并加入响应事件)