zoukankan      html  css  js  c++  java
  • CDockablePane使用总结

    基于 http://blog.csdn.net/kikaylee/article/details/8936953

    CDockablePane的基本布局和用法    

    新建一个SDI工程,在CMainFrame类中添加一个CDockablePane数组:

    CDockablePane m_Panes[5];// 一个CDockablePane的数组

    CMainFrame:: OnCreate() 函数中自动生成了以下代码:

    // 启用 Visual Studio 2005 样式停靠窗口行为

         CDockingManager::SetDockingMode(DT_SMART);

         // 启?用 Visual Studio 2005 样式停靠窗口自动隐藏行为

         EnableAutoHidePanes(CBRS_ALIGN_ANY);

         EnableDocking(CBRS_ALIGN_ANY);

    以下添加代码位于该段代码之后。

    1.1  第一种情况

     

    //添加CDockablePane

    if(!m_Panes[0].Create("Pane 0",this,CRect(0,0,200,100),TRUE,1000,

    WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_ALIGN_BOTTOM|CBRS_FLOAT_MULTI))

    { return FALSE;}

    m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

    DockPane(&m_Panes[0]);// LEFT

    1.2  第二种情况

    if (!m_Panes[0].Create(_T("Pane 0"), this, CRect(0, 0, 200, 100), TRUE, 1000,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

    {return FALSE;}

    if (!m_Panes[1].Create(_T("Pane 1"), this, CRect(0, 0, 200, 100), TRUE, 1001,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI))

    {return FALSE;}

    m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

    m_Panes[1].EnableDocking(CBRS_ALIGN_ANY);

    DockPane(&m_Panes[1]);// BOTTOM,优先占满底部窗口,左侧窗口只能占一部分

    DockPane(&m_Panes[0]);// LEFT

         代码中先停靠的Pane会优先占满一侧的窗口。但是如果手动调整过Pane的位置,程序启动时会读取最近一侧程序关闭时各Pane的停靠位置,就是所谓的记忆界面布局。为了看到代码的设置效果,可以将程序在注册表中的信息删除,然后编译运行程序。使用VS调试代码时,项目的信息存储位置为:

         HKEY_CURRENT_USERSoftWare应用程序向导生成的本地应用程序projectName

    需要注意的是,不同的CDockablePane调用Create函数时,其UID值必须不同,因为程序关闭后重新启动时,会去注册表读取界面布局信息,不同pane的位置信息与其UID值相关联,如果两个Pane的UID值相同,就有可能报错。MSDN:Specifies the ID of the child window. This value must be unique if you want to save docking state for this docking pane.

    1.3  第三种情况

     

    if (!m_Panes[0].Create(_T("Pane 0"), this, CRect(0, 0, 200, 100), TRUE, 1000,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

    {return FALSE;}

    if (!m_Panes[1].Create(_T("Pane 1"), this, CRect(0, 0, 200, 100), TRUE, 1001,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

    {return FALSE;}

    m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

    m_Panes[1].EnableDocking(CBRS_ALIGN_ANY);

    DockPane(&m_Panes[0]);// LEFT

    DockPane(&m_Panes[1]);// LEFT

    // 注意这里,将0放在1上面

    m_Panes[0].DockToWindow(&m_Panes[1], CBRS_TOP);

    1.4  第四种情况

     

    if (!m_Panes[0].Create(_T("Pane 0"), this, CRect(0, 0, 200, 100), TRUE, 1000,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

    {return FALSE;}

    if (!m_Panes[1].Create(_T("Pane 1"), this, CRect(0, 0, 200, 100), TRUE, 1001,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

    {return FALSE;}

    if (!m_Panes[2].Create(_T("Pane 2"), this, CRect(0, 0, 200, 100), TRUE, 1002,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

    {return FALSE;}

    m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

    m_Panes[1].EnableDocking(CBRS_ALIGN_ANY);

    m_Panes[2].EnableDocking(CBRS_ALIGN_ANY);

    DockPane(&m_Panes[0]);// LEFT

    DockPane(&m_Panes[1]);// LEFT

    DockPane(&m_Panes[2]);// LEFT

    CDockablePane* pTabbedBar = NULL;

    // 放到同一个选项卡中,并默认选择1

    m_Panes[1].AttachToTabWnd(&m_Panes[0], DM_SHOW, TRUE, &pTabbedBar);

    // 放到同一个选项卡中,并默认选择2

    m_Panes[2].AttachToTabWnd(&m_Panes[0], DM_SHOW, TRUE, &pTabbedBar);

    或者

    // 放到同一个选项卡中,并默认选择1

    m_Panes[1].AttachToTabWnd(&m_Panes[0], DM_SHOW, TRUE, &pTabbedBar);

    CDockablePane* pTabbedBar1 = NULL;

    // 放到同一个选项卡中,并默认选择2

    m_Panes[2].AttachToTabWnd(pTabbledBar,DM_SHOW,TRUE,&pTabbledBar1);

    1.5  第五种情况

     

    if (!m_Panes[0].Create(_T("Pane 0"), this, CRect(0, 0, 200, 100), TRUE, 1000,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI))

    {return FALSE;}

    if (!m_Panes[1].Create(_T("Pane 1"), this, CRect(0, 0, 200, 100), TRUE, 1001,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI))

    {return FALSE;}

    if (!m_Panes[2].Create(_T("Pane 2"), this, CRect(0, 0, 200, 100), TRUE, 1002,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

    {return FALSE;}

    if (!m_Panes[3].Create(_T("Pane 3"), this, CRect(0, 0, 200, 100), TRUE, 1003,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))

    {return FALSE;}

    if (!m_Panes[4].Create(_T("Pane 4"), this, CRect(0, 0, 200, 100), TRUE, 1004,

    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |

    WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))

    {return FALSE;}

    m_Panes[0].EnableDocking(CBRS_ALIGN_ANY);

    m_Panes[1].EnableDocking(CBRS_ALIGN_ANY);

    m_Panes[2].EnableDocking(CBRS_ALIGN_ANY);

    m_Panes[3].EnableDocking(CBRS_ALIGN_ANY);

    m_Panes[4].EnableDocking(CBRS_ALIGN_ANY);

    DockPane(&m_Panes[0]);// BOTTOM

    DockPane(&m_Panes[1]);// BOTTOM

    DockPane(&m_Panes[2]);// LEFT

    DockPane(&m_Panes[3]);// LEFT

    DockPane(&m_Panes[4]);// RIGHT

    CDockablePane* pTabbedBar = NULL;

    m_Panes[0].DockToWindow(&m_Panes[1], CBRS_LEFT);

    m_Panes[3].AttachToTabWnd(&m_Panes[2], DM_SHOW, TRUE, &pTabbedBar);

  • 相关阅读:
    斐波那契数列
    用两个栈实现队列
    从尾到头打印链表
    HDOJ5877(dfs序+离散化+树状数组)
    HDOJ5876(补图的最短路)
    POJ3090(欧拉函数)
    POJ2478(欧拉函数)
    POJ2407(欧拉函数)
    POJ2142(扩展欧几里得)
    POJ3020(最小边覆盖)
  • 原文地址:https://www.cnblogs.com/canger/p/4156506.html
Copyright © 2011-2022 走看看