1. 程式人生 > >VS2010-MFC:單文件左側可停靠對話方塊(包含樹控制元件)的實現

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"

最後即可編譯成功

轉:https://blog.csdn.net/HW140701/article/details/69382284