选中CTreeCtrl的节点,弹出对话框嵌入到客户区中

来源:互联网 发布:轩辕剑符鬼进阶数据 编辑:程序博客网 时间:2024/06/04 18:53

前言

在Outlookbar工具栏中,有CTreeCtrl树控件,点击一个节点,弹出的对话框会嵌入到客户区中。本文的样例涉及到BCGControlBar V22.1控件库,使用的是该库的自带例子BCGPOrganizer,可以在\BCGSoft\BCGControlBarPro\Samples下找到。

实现的效果

这里写图片描述

修改如下

1、新建一个类CMacrosView,该类继承CView,新建的类用来显示要弹出的对话框。在该类中声明LoadDlg函数,原型如下:

void LoadDlg(UINT nID, CString strName);//nID是树节点ID号,strName是节点名称

LoadDlg函数的定义如下:

void CMacrosView::LoadDlg(UINT nID, CString strName){    CRect rect;    GetClientRect(&rect);    ClientToScreen(&rect);     if(strName == "反应堆压力容器" )     {         CGravityAnalysisDlg* pGADlg = new CGravityAnalysisDlg;         pGADlg->Create(IDD_NEW_REACTOR_PRESSURE, this);         pGADlg->ShowWindow(SW_SHOW);         pGADlg->MoveWindow(0, 0, rect.Width(), rect.Height(), 1);     }     else if(strName == "蒸汽发生器")     {        ...     }     else if(strName == "自重分析")     {        ...     }}

2、CBCGPOrganizerDoc类中添加LoadMacros函数
函数声明:

    void LoadMacrosDlg(UINT nID, CString strName);//nID是树节点ID号,strName是节点名称

函数定义:

void CBCGPOrganizerDoc::LoadMacrosDlg(UINT nID, CString strName){    CMacrosView* pView = DYNAMIC_DOWNCAST(CMacrosView, GetView(e_ModeMacros));    if(pView != NULL)    {        ASSERT_VALID(pView);        pView->LoadDlg(nID, strName);    }}

3、修改CMacrosBar的双击事件

void CMacrosBar::OnDblclk(NMHDR* /*pNMHDR*/, LRESULT* pResult) {    HTREEITEM hItem = GetSelectedItem();    if (hItem != NULL /*&& !ItemHasChildren(hItem)*/)    {        CFrameWnd* pFrameWnd = (CFrameWnd*)GetTopLevelFrame ();        ASSERT_VALID (pFrameWnd);        CBCGPOrganizerDoc* pDoc =             DYNAMIC_DOWNCAST(CBCGPOrganizerDoc, pFrameWnd->GetActiveDocument ());        if (pDoc != NULL)        {            /*LoadMacrosDlg函数新定义的函数用来打开选中的应用对话框*/            pDoc->LoadMacrosDlg ((UINT)GetItemData (hItem), GetItemText (hItem));        }    }    *pResult = 0;}

4、其他注意点
需要弹出的对话框,需要把该对话框的Style属性设置为Child,Border设为None.

1 0