【MFC】停靠窗口CDockablePane类重叠问题

前面已经了解过CDockablePane类,作用是使我们的窗口可以停靠在界面,这个功能在很多软件中都有涉及,太普遍了,也很实用,但是,有时候在工作中有这样的要求:小熊啊,那个,你把,这个,这个,这个,三个对话框的窗口停靠在界面的某处,使他们相当于是重叠在一个窗口,但是下面可以提供切换。
工作中,需求很多变,这里只提供这个重叠的核心思路,其他变通还需自己熏陶一下。

在CDockablePane类下有一个方法,AttachToTabWnd,意思是:将当前窗格附加到目标窗格,使其成为一种选项卡式的窗格。

1. CDockablePane::AttachToTabWnd
MFC官方文档是这么写的:

virtual CDockablePane* AttachToTabWnd(
    CDockablePane* pTabControlBarAttachTo,  
    AFX_DOCK_METHOD dockMethod,  
    BOOL bSetActive= TRUE,  
    CDockablePane** ppTabbedControlBar = NULL);  

参数解释:
CDockablePane* pTabControlBarAttachTo:指定当前窗格将附加到目标窗格,且目标窗格必须为可停靠窗格,不然无效,(可以是in,也可以是out,传入传出参数)

AFX_DOCK_METHOD dockMethod:指定的扩展方法.
可选扩展方法:

//DM -- dock method
enum AFX_DOCK_METHOD
{
	DM_UNKNOWN,  
	DM_MOUSE,
	DM_DBL_CLICK,
	DM_SHOW,
	DM_RECT,
	DM_STANDARD
};

BOOL bSetActive:默认为TRUE,可写可不写,这里一般都是TRUE才有意义。(附加操作后激活选项卡)

CDockablePane** ppTabbedControlBar:默认为NULL,但是我们要是拥有多个窗口(3个)以上,这个参数就要用上,定义一个这个类型。(保存生成的选项卡式窗格,后面也按照这个样式)

返回值:如果它不是选项卡中的窗格,返回值为NULL,不能附加到选项卡窗格,发生错误,如果是选项卡中的窗格,则返回附加操作生成的指针。

2. 案例
两个案例,第一个是网上找的,我没试,第二个是我工作中的案例。

  • 2.1:两个窗口重叠
    这里只粘贴核心代码。
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

//下面就是重叠窗口的实现了,内容都放在MainFrm中的OnCreate()。
CDockablePane* pTabbedBar = NULL;
// 放到同一个选项卡中,并默认选择1
m_Panes[1].AttachToTabWnd(&m_Panes[0], DM_SHOW, TRUE, &pTabbedBar);
  • 2.2:多个窗口重叠
//停靠两步骤,缺一不可.
//第一步:创建停靠窗格,方便停靠
if(1m_TreePane.Create(_T("终端命令"),this,CRect(0,0,200,400),TRUE,41005,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))
{
	TRACE0("终端命令控制框未能创建/n");
	return FALSE;
}
if(1m_JOGPane.Create(_T("电机运动控制"),this,CRect(0,0,800,300),TRUE,41007,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
{
	TRACE0("电机运动控制框未能创建/n"); //这里ACE后面是数字0,不是字母O;
	return FALSE; //这里返回什么还得看你当前函数,具体情况具体分析.
}
if(1m_PlotPane.Create(_T("作图"),this,CRect(0,0,1200,800),TRUE,41008,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
{
	TRACE0("作图框未能创建/n");
	return FALSE;
}
//第二步:开启停靠窗格
m_TreePane.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_TreePane);
m_JOGPane.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_JOGPane);
m_PlotPane.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_PlotPane);

//窗口重叠:
CDockablePane* pTabbedBar = NULL;//保存选项卡式窗格样式
//下面参数已经说过,看不懂,上面看参数分析。
m_JOGPane.AttachToTabWnd(&m_TreePane,DM_SHOW,TRUE,&pTabbedBar);
m_PlotPane.AttachToTabWnd(pTabbedBar,DM_SHOW,TRUE); //这里直接用保存的选项卡样式代替。
//ps:如果要添加更多,继续添加即可.

3. 备注
当用此方法时,将发生以下情况,或者说会做以下检查。
3.1:framework检查目标窗格中是否是正则表达式停靠窗格,CDockablePane是否派生自CDockablePane类。:

3.2:如果目标窗格是选项卡式窗格,则添加选项卡。

3.3:如果目标窗格是普通停靠窗格,则创建一个选项卡样式窗格。

3.4:如果当前窗格中派生自CDockablePane,所有其选项卡移动到pTabControlBarAttachTo当前窗格中将被破坏。 因此,应小心时调用此方法,因为该方法将返回到当前窗格中的指针可能无效。

如果生成停靠布局时,可附加到另一个窗格中,设置dockMethod为DM_SHOW。 另一个窗格附加到它之前,应该停靠到第一个窗格。

当前内容我工作已经可以了,所以就没有继续扩展,如果感觉不够,大家可以去看看其他博主,也许会有我这里没说到的,谢谢。
版权声明:转载请注明出处。

猜你喜欢

转载自blog.csdn.net/m0_43458204/article/details/106682891