VC++模式对话框和非模式对话框剖析

2014-07-29 22:32:46|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 界面设计, MFC|来源:唯设编程网

在VC中对话框有模式对话框和非模式对话框两种,模式对话框在对话框返回之前用户只能与该对话框交互,而非模式对话框则没有这个限制。以下用基于Visual Studio 2008的MFC为例,通过实例介绍VC的模式对话框和非模式对话框在创建过程中的区别。

1.创建应用程序框架

首先创建一个MFC单文档应用程序,名称为DialogTest.

打开资源视图——Menu——IDR_MAINFRAME,在菜单栏中添加一个标签“对话框测试”,ID设置为IDM_DIALOGTEST,在属性中把popup属性设置为false.添加两个子菜单,第一个子菜单的名字为“模式对话框”,ID为IDM_DIALOG1;第二个子菜单的名字为“非模式对话框”,ID为IDM_DIALOG2.

2. 添加对话框资源

之后在资源视图中的Dialog中添加一个对话框,并添加一个静态文本控件,Caption设置为“模式对话框”,ID为IDD_DIALOG1,双击对话框空白处,在弹出的MFC类向导中命名类名为CTestDlg1,基类选择CDialog,之后完成。

同理添加另一个对话框,ID为IDD_DIALOG2。在MFC类向导中的类名设置为CTestDlg2,基类同样为CDialog.

3. 添加菜单的响应函数

完成资源的添加后,我们就要完善代码。再次打开IDR_MAINFRAME,右键选择“模式对话框”,在弹出的右键菜单中选择“添加事件处理程序”,在弹出的对话框中的“消息类型”选择COMMAND,类列表选择CDialogTestView,点击“添加编辑”,输入代码:

CTestDlg1 dlg;
dlg.DoModal();

此时,模式对话框创建完毕。

相对于模式对话框来说,非模式对话框的创建相对复杂一点。同样是再次打开IDR_MAINFRAME,右键选择“非模式对话框”,在弹出的右键菜单中选择“添加事件处理程序”,在弹出的对话框中的“消息类型”选择COMMAND,类列表选择CDialogTestView,点击“添加编辑”,输入代码:

CTestDlg2 *pDlg=new CTestDlg2;
pDlg->Create(IDD_DIALOG2,this);
pDlg->ShowWindow(SW_SHOW);

在这里,我将对话框对象定义为指针,在堆上分配内存,使其与程序的生命周期一致。之后用Creat()函数创建一个对话框,并用ShowWindow()将其显示出来。这里用到了指针指向操作符,只因为定义的对话框对象为指针类型,且调用了其成员函数(有C++基础的都会明白这一点吧......)。由于pDlg这个指针变量为局部对象,当其生命周期结束后,其保存的内存地址就会丢失。所以我们应该在CTestDlg2类中重载PostNcDestroy这个虚函数来释放this指针指向的内存。只需在这个函数中添加一句:

delete this;
CDialog::PostNcDestroy();

因为我们在程序中使用了CTestDlg1,CTestDlg2,CDialogTestView类并不清楚其数据类型。因此我们要在DialogTestView.cpp开始出添加:

#include "TestDlg1.h"
#include "TestDlg2.h"

编译运行程序,结果如下所示:

到此,模式对话框和非模式对话框菜单的响应事件就全部完成了,可以发现,模式对话框在对话框退出之前用户只能与该对话框交互,而非模式对话框则没有这个限制。

发表评论0条 】
网友评论(共?条评论)..
VC++模式对话框和非模式对话框剖析