概念:
在許多程式中,有些視窗可以被拖放到另一個視窗中,並溶為一體,還可以停靠在主視窗的上中下、左右兩側。當設定為隱藏時,就會像QQ一樣收縮起來,有滑鼠移到其上時又會像QQ一樣出來,這類視窗就叫停靠視窗。如:Visual Studio 2010視窗中的各個小視窗,如:輸出視窗、類視窗等。
編程方法:
值得注意的是:這種視窗創建之後,默認情況下是不可停靠的和隱藏的,還要通過調用EnableDocking()和DockPane()這兩個函式使他們可停靠和顯示出來。
下面是實例代碼,一共生成了視圖、檔案、輸出三個停靠視窗。主要使用的函式是Create()函式。
另外,LoadString()函式的作用是調用String Table裡面定義的信息,也就是說,把String Table Caption裡面的字元串讀出來到CString對象里。String Table中的ID號及其對應的字元串都是可以自己定義的。 String Table在ResourceView視窗中,也就是ClassView右邊那個視窗。雙擊之後就能看到,在最下面的選項中追加新的ID信息。
具體代碼:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//。。。。。。。。。。。。。。。
// 創建停靠視窗
if (!CreateDockingWindows())//調用下面的BOOL CMainFrame::CreateDockingWindows()函式
{
TRACE0("未能創建停靠視窗\n");
return -1;
}
m_wndFileView.EnableDocking(CBRS_ALIGN_ANY); //使檔案視圖視窗可停靠
m_wndClassView.EnableDocking(CBRS_ALIGN_ANY); //使類視圖視窗可停靠
DockPane(&m_wndFileView); //使檔案視圖視窗顯示出來
CDockablePane* pTabbedBar = NULL;
m_wndClassView.AttachToTabWnd(&m_wndFileView, DM_SHOW, TRUE, &pTabbedBar);
m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndOutput); //使輸出視窗顯示出來
}
//創建停靠視窗的定義
BOOL CMainFrame::CreateDockingWindows()
{
BOOL bNameValid;
// 創建類視圖
CString strClassView; //聲明一個字元串變數,這是為了給生成的停靠視窗取名
bNameValid = strClassView.LoadString(IDS_CLASS_VIEW);
ASSERT(bNameValid);
//開始調用Create()函式創建停靠視窗
if (!m_wndClassView.Create(strClassView, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_CLASSVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))
{
TRACE0("未能創建“類視圖”視窗\n");
return FALSE; // 未能創建
}
// 創建檔案視圖
CString strFileView;
bNameValid = strFileView.LoadString(IDS_FILE_VIEW);
ASSERT(bNameValid);
if (!m_wndFileView.Create(strFileView, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_FILEVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT| CBRS_FLOAT_MULTI))
{
TRACE0("未能創建“檔案視圖”視窗\n");
return FALSE; // 未能創建
}
// 創建輸出視窗
CString strOutputWnd;
bNameValid = strOutputWnd.LoadString(IDS_OUTPUT_WND);
ASSERT(bNameValid);
if (!m_wndOutput.Create(strOutputWnd, this, CRect(0, 0, 100, 100), TRUE, ID_VIEW_OUTPUTWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI))
{
TRACE0("未能創建輸出視窗\n");
return FALSE; // 未能創建
}
SetDockingWindowIcons(theApp.m_bHiColorIcons);
return TRUE;
}