注意:以下实例中创建模态对话框时没有用create(id号)绑定资源id,而非模态对话框中要用create(id号)绑定对话框资源id。
在MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box)。本文对此分别简述其创建方法。
一、模态对话框(model dialog box)
//创建一个模态对话框CTestDialog td;td.DoModal();
二、非模态对话框(modaless dialog box)
此处采用和上面一样的方式来创建一个非模态对话框,代码如下:
CTestDialog td;td.Create(IDD_DIALOG1); //创建一个非模态对话框td.ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
那么,在运行时,你会发现此对话框无法显示。这是因为你声明的对话框变量td是局部变量,但这个函数返回时,td也被析构了,所以无法显示此对话框。
创建非模态对话框,必须声明一个指向CTestDialog类的指针变量,且需要显示的调用ShowWindow()才能将对话框显示出来。有两种创建方法:
(1)采用局部变量创建一个非模态对话框
//采用局部变量创建一个非模态对话框CTestDialog *pTD = new CTestDialog();pTD->Create(IDD_DIALOG1); //创建一个非模态对话框pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
(2)采用成员变量创建一个非模态对话框
首先在你所要编写的类的头文件中声明一个指针变量:
private:CTestDialog *pTD;
然后再在相应的CPP文件,在你要创建对话框的位置添加如下代码:
//采用成员变量创建一个非模态对话框pTD = new CTestDialog(); //给指针分配内存pTD->Create(IDD_DIALOG1); //创建一个非模态对话框pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
最后在所在类的析构函数中收回pTD所指向的内存:
delete pTD;
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
众所周知的,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()
函数如下:
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_editSumm_editSum = m_editSummand + m_editAddend;// 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值UpdateData(FALSE);}
4.因为此非模态对话框实例是动态创建的,所以需要手动删除此动态对象来销毁对话框。我们在 CAdditionDlg类的析构函数中添加删除代码,但是MFC并没有自动给出析构函数,这时需要我们手动添加,在对话框对象析构时就会调用我们自定义 的析构函数了。在AdditionDlg.h文件中为CAdditionDlg添加析构函数声明:~CAdditionDlg();,然后在 AdditionDlg.cpp文件中添加析构函数的实现,函数体如下:
CAdditionDlg::~CAdditionDlg(){// 如果非模态对话框已经创建则删除它if (NULL != m_pTipDlg){// 删除非模态对话框对象delete m_pTipDlg;}}
这样,非模态对话框创建和显示的代码就添加修改完了。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233093.html原文链接:https://javaforall.net
