VS2010-MFC:單文件左側可停靠對話方塊(包含樹控制元件)的實現
在程式開發中我們經常看見有一些軟體左側有目錄樹或者是圖層樹,點選之後就可以右側View視窗顯示相關的內容,其實實現這種機制有兩種方法,第一種就是對MFC的View視窗進行視窗分割,左側的視窗view類派生於CTreeView,其中CTreeView自帶一個變數用於View中的樹控制元件的控制。第二種方法就是用一個可停靠的面板巢狀一個對話方塊,再在對話方塊中新增樹控制元件,同樣可以達到相同的目的。
以下詳解搭建步驟:
第一步:在VS2010中生成一個MFC經典風格的單文件程式,命名為CMyTestMFCDlg,編譯下保證沒有出錯。
第二步:為該工程新增一個新類CMyDockablePane,派生於CDockablePane。
第三步:新建上述類完成後,在CMainFrame標頭檔案中包含該類的標頭檔案#include "MyDockablePane.h"
宣告該類的物件:
public:
CMyDockablePane m_MyDockablePane;
然後在CMainFrame的CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中建立可停靠面板
////建立可停靠對話方塊
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_DOCKDIALOG,在對話方塊屬性中將Style設為Child,Border設為None。
為該對話方塊新建類:CDockDialog,基類為CDialogEx。
新增一個樹控制元件,IDC_TREE_Test,為樹控制元件關聯一個控制元件變數m_TreeControl
在MyDockablePane.h中包含標頭檔案#include "DockDialog.h"
新增CDockDialog 類的成員變數:CDockDialog m_TestDlg;
新增CMyDockablePane的WM_CREATE和WM_SIZE訊息響應函式
在函式中新增以下程式碼
int CMyDockablePane::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此新增您專用的建立程式碼
/*-----------面板初始化建立對話方塊-------------*/
CRect rectDummy;
rectDummy.SetRectEmpty();
// 建立選項卡視窗:
if (!m_TestDlg.Create(IDD_DIALOG_DOCKDIALOG,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: 在此處新增訊息處理程式程式碼
// 選項卡控制元件應覆蓋整個工作區
/*---------------------------------------------------------------------------------------*/
m_TestDlg.SetWindowPos (this, -1, -1, cx, cy, SWP_NOMOVE |SWP_NOACTIVATE | SWP_NOZORDER);
m_TestDlg.ShowWindow(SW_SHOW);
/*---------------------------------------------------------------------------------------*/
}
第五步:在CDockDialog類中過載虛擬函式OnInitDialog(),新增以下程式碼初始化樹控制元件
BOOL CDockDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此新增額外的初始化
HTREEITEM rootItem = m_TreeControl.InsertItem(TEXT("根節點"), 0, 0, NULL);
HTREEITEM parentItem = m_TreeControl.InsertItem(TEXT("父節點"), 1, 1, rootItem);
HTREEITEM subItem1 = m_TreeControl.InsertItem(TEXT("子節點"), 2, 2, parentItem);
HTREEITEM subItem2 = m_TreeControl.InsertItem(TEXT("子節點"), 2, 2, parentItem);
m_TreeControl.SelectItem(subItem2);
return TRUE; // return TRUE unless you set the focus to a control
// 異常: OCX 屬性頁應返回 FALSE
}
最後,為了防止報錯,在CDockDialog標頭檔案中新增#include "resource.h"
最後即可編譯成功