如果是想做成TAB页的,需要在正常创建完该pane并Dock完之后加入代码:
正常:
BOOL bNameValid;
// 创建属性窗口
CString strPropertiesWnd;
bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND);
ASSERT(bNameValid);
if (!m_wndProperties.Create(strPropertiesWnd, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_PROPERTIESWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
{
TRACE0("未能创建“属性”窗口\n");
return FALSE; // 未能创建
}
// 创建事件窗口
CString strEventsWnd;
bNameValid = strEventsWnd.LoadString(IDS_EVENTS_WND);
ASSERT(bNameValid);
if (!m_wndEvents.Create(strEventsWnd, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_EVENTSWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
{
TRACE0("未能创建“事件”窗口\n");
return FALSE; // 未能创建
}
//创建数据统计窗口
CString strStatisticsWnd;
bNameValid = strStatisticsWnd.LoadString(IDS_STATISTICS_WND);
ASSERT(bNameValid);
if (!m_wndStatistics.Create(strStatisticsWnd, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_STATISTICSWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
{
TRACE0("未能创建“数据统计”窗口\n");
return FALSE; // 未能创建
}
//创建视频窗口
CString strVideoWnd;
bNameValid = strVideoWnd.LoadString(IDS_VIDEO_WND);
ASSERT(bNameValid);
if (!m_wndVideo.Create(strVideoWnd, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_VIDEOWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_BOTTOM| CBRS_FLOAT_MULTI))
{
TRACE0("未能创建“视频”窗口\n");
return FALSE; // 未能创建
}
//开始Dock
m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndProperties);
m_wndEvents.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndEvents);
m_wndStatistics.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndStatistics);
特别加入的代码:
CDockablePane* pTabbedBar = NULL;
m_wndEvents.AttachToTabWnd(&m_wndProperties, DM_SHOW, FALSE, &pTabbedBar);//第三个参数 BOOL bSetActive = TRUE/FALSE
m_wndStatistics.AttachToTabWnd(&m_wndProperties, DM_SHOW, FALSE, &pTabbedBar);//第三个参数 BOOL bSetActive = TRUE/FALSE
要控制当前显示哪个TAB页,请注意上面的第三个参数。
如果想要在左侧视频窗口在属性窗口的下面需要:
m_wndVideo.DockToWindow(&m_wndProperties,CBRS_BOTTOM);
如果需要控制上下的大小还要需要创建两个panel的时候注意是在左侧还是底部创建。
其他相关:https://msdn.microsoft.com/zh-tw/library/vstudio/bb983712.aspx
CDockablePane::AttachToTabWnd
virtual CDockablePane* AttachToTabWnd( CDockablePane* pTabControlBarAttachTo, AFX_DOCK_METHOD dockMethod, BOOL bSetActive = TRUE, CDockablePane** ppTabbedControlBar = NULL );
使用這個方法時,將可停駐窗格附加至另一個窗格,則會發生下列動作:
-
此架構會檢查目標窗格 pTabControlBarAttachTo 是標準停駐窗格,或是從 CBaseTabbedPane衍生。
-
如果目標是一個窗格的索引窗格,此架構會將目前窗格加入至它為索引標籤。
-
如果目標窗格是一般停駐窗格,架構會建立索引窗格。
-
架構會呼叫 pTabControlBarAttachTo-_>CreateTabbedPane。 新的索引窗格設定樣式取決於 m_pTabbedControlBarRTC 成員。 根據預設,成員設定為 CTabbedPane執行階段類別。 如果您傳遞 AFX_CBRS_OUTLOOK_TABS 樣式做為 dwTabbedStyle 參數設定為 CDockablePane::Create 方法,執行階段類別物件設定為 CMFCOutlookBar執行階段類別。 您可以隨時變更成員變更新窗格的樣式。
-
當這個方法會建立索引標籤窗格時,架構會取代指標 pTabControlBarAttachTo (如果窗格固定或浮動在多的小型框架視窗) 以指向新索引標籤式窗格。
-
架構會將 pTabControlBarAttachTo 窗格加入的索引窗格,第一個索引標籤。 架構會將目前窗格做為第二個索引標籤。
-
-
如果目前的窗格。 CBaseTabbedPane衍生,它所有的索引標籤會移至 pTabControlBarAttachTo ,並終結目前窗格。 因此,請注意,當您呼叫時,這個方法,因為對目前窗格的指標可能是無效的,則當方法傳回時。
如果附加一個窗格加入至另一個,當建立停駐配置時,設定 dockMethod 至 DM_SHOW。
在附加另一個窗格為它之前,您應該修正第一個窗格。