CDockablePane停靠窗口关联对话框

来源:互联网 发布:端口号范围 编辑:程序博客网 时间:2024/05/19 03:29

阅读受众需有一定MFC知识储备。

(技术支持:http://www.cnblogs.com/shuhaoc/archive/2011/06/26/cdockableform.html)



在以往很多使用CCoolBar实现窗口停靠功能,但是在VS2010中编译CCoolBar的时候会出现很多错误,我的小白也不知道如何解决。


我看到在CSDN以及其他论坛都有人发帖询问如何解决CCoolBar在VS2010 中编译错误,但是始终没有人解答。


近日偶然搜到到CDockablePane可有类似的功能,所以打算写个记录贴。记录CDockablePane的使用。


第一步: CDockablePane的简单介绍。   CDockablePane是MFC的一个类 ,至于到哪个版本的MFC才出现这个类我不清楚。

不过可以肯定的是VS2010中MFC有这个类。VC6的MFC中没有这个类,不然大家也不会在VC6中使用CCoolBar 了。

窗格是窗格的意思,Dockable是可停靠的意思。合起来就是可停靠的窗口 ,是不是和CCoolBar一样? 那太一样了,简直是一个妈生的。

估计开发CCoolBar这哥们去了微软了。

想象一下,我们实例化一个CDockbalePane的对象,然后将对话框放在里面,那是太爽了。一下子程序的窗口脉络就清晰起来。

而且后续的窗口内部的消息的处理也好办了。


第二步: CDockablePane的继承和成员。 http://msdn.microsoft.com/zh-cn/library/bb984433.aspx

继承关系如下(来自MSDN)

CObject

   CCmdTarget

      CWnd

         CBasePane

            CPane

               CDockablePane

成员如下(来自MSDN)见链接

http://msdn.microsoft.com/zh-cn/library/bb984433.aspx


第三步:正式开始使用

A:使用VS2010创建一个单文档MFC程序,创建完毕之后编译。确认这一步没有出错。


B 通过类向导 创建一个继承自CDockablePane的类。 名字就叫 CMyDockablePane


创建完毕之后编译,应该是没有错误的。

C:在CMainFrame头文件中实例化一个对象,当然是CMyDockablePane的对象。

当然需要在CMainFrame头文件添加一个头文件 #include "MyDockablePane.h"

public:
CMyDockablePane  m_MyDockablePane;






D:在CMainFrame的OnCreate函数中调用CMyDockablePane的Create函数创建窗格。




代码如下:

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_DOCKDLG,Style设为Child,Border设为None


为该对话框添加类CTestDlg ,基类为:CDialog ,Dialog ID为IDD_DIALOG_DOCKDLG ;


在MyDockablePane.h中包含头文件#include "TestDlg.h"

给CMyDockablePane类添加成员变量CTestDlg m_TestDlg;

给CMyDockablePane类添加WM_CREATE和WM_SIZE响应

CMyDockablePane::OnCreateCMyDockablePane::OnSize函数中添加代码,如下
int CMyDockablePane::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDockablePane::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  Add your specializedcreation code here
    CRect rectDummy;
    rectDummy.SetRectEmpty();

    // 创建选项卡窗口:
    if (!m_TestDlg.Create(IDD_DIALOG_DOCKDLG,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);

    // TODO: Add your message handler codehere
    //
选项卡控件应覆盖整个工作区
    m_TestDlg.SetWindowPos (this, -1, -1, cx, cy, SWP_NOMOVE |SWP_NOACTIVATE | SWP_NOZORDER);
    m_TestDlg.ShowWindow(SW_SHOW);
}


此时可以看到,停靠窗口中显示对话框,这样的话,我们就可以在该对话框中放置树形控件啦!!


Tips:运行的时候报一个错,定位到错误代码:enum { IDD = IDD_DIALOG_DOCKDLG };

将该语句注释掉,运行,再取消注释,再运行,OK,没问题了,不知道原因。




参考:http://blog.csdn.net/wenluderen/article/details/25389481

1 0