VS2010-MFC:单文档左侧可停靠对话框(包含树控件)的实现

版权声明:本文为博主原创文章,未经博主允许不得转载,如需转载请先得到博主的同意,谢谢。    https://blog.csdn.net/HW140701/article/details/69382284


在程序开发中我们经常看见有一些软件左侧有目录树或者是图层树,点击之后就可以右侧View窗口显示相关的内容,其实实现这种机制有两种方法,第一种就是对MFC的View窗口进行窗口分割,左侧的窗口view类派生于CTreeView,其中CTreeView自带一个变量用于View中的树控件的控制。第二种方法就是用一个可停靠的面板嵌套一个对话框,再在对话框中添加树控件,同样可以达到相同的目的。

以下详解搭建步骤:

第一步:在VS2010中生成一个MFC经典风格的单文档程序,命名为CMyTestMFCDlg,编译下保证没有出错。

第二步:为该工程添加一个新类CMyDockablePane,派生于CDockablePane。

第三步:新建上述类完成后,在CMainFrame头文件中包含该类的头文件#include "MyDockablePane.h"

   声明该类的对象:

 

  1. public:

  2. 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"


最后即可编译成功


--------------------- 
作者:HW140701 
来源:CSDN 
原文:https://blog.csdn.net/HW140701/article/details/69382284 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值