众所周知的,MFC中非模态对话框在显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换。本文就来给大家讲解一下非模态对话框的实现方法:
一、非模态对话框的对话框资源和对话框类
实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,因此,在创建模态对话框时所创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改。
二、创建及显示非模态对话框的步骤
需要修改的是,对话框类实例的创建和显示,也就是之前在CAdditionDlg::OnBnClickedAddButton()函数体中添加的对话框显示代码。下面是具体步骤:
1. 在AdditionDlg.h中包含CTipDlg头文件并定义CTipDlg类型的指针成员变量。详细操作方法是,在AdditionDlg.cpp中 删除之前添加的#include "TipDlg.h",而在AdditionDlg.h中添加#include "TipDlg.h",这是因为我们需要在AdditionDlg.h中定义CTipDlg类型的指针变量,所以要先包含它的头文件;然后在 AdditionDlg.h中为CAdditionDlg类添加private成员变量CTipDlg *m_pTipDlg;。
2.在CAdditionDlg类的构造函数中初始化成员变量m_pTipDlg。如果cpp文件中函数太多,我们可以在Class View上半个视图中找到CAdditionDlg类,再在下半个视图中找到其构造函数双击,中间客户区域即可马上切到构造函数的实现处。在构造函数体中 添加m_pTipDlg = NULL;,这是个好习惯,在任何指针变量使用前都初始化,可以避免因误访问重要内存地址而 破坏此地址的数据。
3.添加非模态对话框的创建和显示代 码。VC++中注释单行代码使用“//”,注释多行代码可以在需注释的代码开始处添加“/*”,结束处添加“*/”。修改后的 CAdditionDlg::OnBnClickedAddButton()
函数如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
void CAdditionDlg::OnBnClickedAddButton() { // TODO: Add your control notification handler code here /*INT_PTR nRes; // 用于保存DoModal函数的返回值 CTipDlg tipDlg; // 构造对话框类CTipDlg的实例 nRes = tipDlg.DoModal(); // 弹出对话框 if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行 return;*/ // 如果指针变量m_pTipDlg的值为NULL,则对话框还未创建,需要动态创建 if (NULL == m_pTipDlg) { // 创建非模态对话框实例 m_pTipDlg = new CTipDlg(); m_pTipDlg->Create(IDD_TIP_DIALOG, this ); } // 显示非模态对话框 m_pTipDlg->ShowWindow(SW_SHOW); // 将各控件中的数据保存到相应的变量 UpdateData(TRUE); // 将被加数和加数的加和赋值给m_editSum m_editSum = m_editSummand + m_editAddend; // 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值 UpdateData(FALSE); } |
4.因为此非模态对话框实例是动态创建的,所以需要手动删除此动态对象来销毁对话框。我们在 CAdditionDlg类的析构函数中添加删除代码,但是MFC并没有自动给出析构函数,这时需要我们手动添加,在对话框对象析构时就会调用我们自定义 的析构函数了。在AdditionDlg.h文件中为CAdditionDlg添加析构函数声明:~CAdditionDlg();,然后在 AdditionDlg.cpp文件中添加析构函数的实现,函数体如下:
1
2
3
4
5
6
7
8
9
|
CAdditionDlg::~CAdditionDlg() { // 如果非模态对话框已经创建则删除它 if (NULL != m_pTipDlg) { // 删除非模态对话框对象 delete m_pTipDlg; } } |
这样,非模态对话框创建和显示的代码就添加修改完了。
这只是一个简单的例子,到这里相信大家对于对话框的使用更上了一个台阶了,可以在不同的情况下可以选择使用模态对话框和非模态对话框了。