【转帖】关于Dialog窗体的嵌套问题实例

本文介绍如何在MFC应用程序中实现基于树形控件的子对话框切换功能,包括创建子对话框、响应选择事件及子对话框的显示与隐藏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

这里首先声明,在此使用的是VC6.0编译器。下面直接讲述步骤,关于原理性的东西请大家看书。

(1)    新建一个基于对话框的MFC应用程序,程序名取为test

(2)    拖入一个树形控件(Tree Control)和一个picture控件,

并把两者的ID名称更改为

ID_Tree_Sel 和ID_STATIC_BTNAREA,并在属性中把前者的Styles更改如下

把后者的Notify属性打上勾

(3)    按ctrl+W打开ClassWizard,在Member Variables中为ID_Tree_Sel添加变量m_tree,为ID_STATIC_BTNAREA添加变量m_area(这个变量这里没有用到,可以不添加)

(4)    新建两个对话框,ID分别为ID_DIALOG1和ID_DIALOG2,并均按下图更改属性Style为child和Border为None。然后在这两个子对话框上分别添加一行文字”This is Dialog 1”和”This is Dialog 2”

(5)    在子对话框1上单击右键,进入classwizard,会弹出一个如下图的Adding a Class对话框问你是否建立一个类,选择Create a new class,然后点击OK,在随后出现的对话框中Name:中输入CDlg1,点击OK

同样,为第二个子对话框建立一个CDlg2的类

(6)    进入testDlg.h文件中,在文件开头加入以下代码

#include "Dlg1.h"

#include "Dlg2.h"

然后新增两个protected类型的变量m_Dlg1和m_Dlg2

CDlg1 m_Dlg1;

CDlg2 m_Dlg2;

转入testDlg.cpp文件中,在OnInitDialog()中加入以下代码

BOOL CTestDlg::OnInitDialog()

{

       CDialog::OnInitDialog();

       // Add "About..." menu item to system menu.

       // IDM_ABOUTBOX must be in the system command range.

       ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

       ASSERT(IDM_ABOUTBOX < 0xF000);

       CMenu* pSysMenu = GetSystemMenu(FALSE);

       if (pSysMenu != NULL)

       {

              CString strAboutMenu;

              strAboutMenu.LoadString(IDS_ABOUTBOX);

              if (!strAboutMenu.IsEmpty())

              {

                     pSysMenu->AppendMenu(MF_SEPARATOR);

                     pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

              }

       }

       // Set the icon for this dialog. The framework does this automatically

       // when the application's main window is not a dialog

       SetIcon(m_hIcon, TRUE);                  // Set big icon

       SetIcon(m_hIcon, FALSE);          // Set small icon

      

       // TODO: Add extra initialization here

       m_tree.DeleteAllItems();

       m_tree.InsertItem("对话框1");

       m_tree.InsertItem("对话框2");

       m_Dlg1.Create(IDD_DIALOG1, this);

       m_Dlg2.Create(IDD_DIALOG2, this);

       //根据获得主对话框上图片控件的尺寸,将子对话框嵌入到主对话框中

             

       CRect r;

       GetDlgItem(IDC_STATIC_BTNAREA)->GetWindowRect(r);

       ScreenToClient(r);

       GetDlgItem(IDC_STATIC_BTNAREA)->DestroyWindow();/*这里可以把图形控件销毁了,否则子对话框将不会响应你的鼠标消息*/

       // 定位属性页

       m_Dlg1.MoveWindow(r);

       m_Dlg2.MoveWindow(r);

      

       //根据所要显示的控件进行对话框的消隐工作   

       m_Dlg1.ShowWindow(SW_HIDE);//显示第一个子对话框

       m_Dlg2.ShowWindow(SW_HIDE);

       return TRUE; // return TRUE unless you set the focus to a control

}

(7)    进入ClassWizard,接下来我们需要为m_tree添加事件响应代码

在上面对话框中点OK,然后编辑代码,在OnSelchangedTreeSel中添加如下代码

void CTestDlg::OnSelchangedTreeSel(NMHDR* pNMHDR, LRESULT* pResult)

{

       NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

       TVITEM item0 = pNMTreeView->itemNew;

       CString str = m_tree.GetItemText(item0.hItem);

      

       if (str.Compare(_T("对话框1")) == 0)

       {

              m_Dlg1.ShowWindow(SW_SHOW);//显示第一个子对话框

              m_Dlg2.ShowWindow(SW_HIDE);//隐藏第二个子对话框

       }

       else

       {

              m_Dlg1.ShowWindow(SW_HIDE);//隐藏第一个子对话框

              m_Dlg2.ShowWindow(SW_SHOW);//显示第二个子对话框

       }

       *pResult = 0;

}

大功告成!!

**************************

http://hi.baidu.com/luo_chen00/blog/item/25cdf09031a74c5bd0135e9d.html

原帖地址!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值