Windows对话框分为两类:模态对话框和非模态对话框。
模态对话框是这样的对话框,当它d出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应 *** 作退出后,其他窗口才能继续与用户交互。
非模态对话框则是,它d出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等。
大家对Windows系统很了解,相信这两种对话框应该都遇到过。之前的加法计算器对话框其实就是模态对话框。
二.模态对话框是怎样d出的
毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么d出来的大家可能还不是很清楚。鸡啄米下面简单说说它是在哪里d出来的,再重新建一个新的对话框并岁蔽d出它,这样大家实践以后就能更灵活的使用模态对话框了。
大家打开Addition.cpp文件,可以看到CAdditionApp类有个InitInstance()函数,在MFC应用程序框架分析中提到过此函数,不过那是单文档应用程序App类中的,函数体不太相同,但都是进行App类实例的初始化工作。
InitInstance()函数的后半部分有一段代码手岩就是定义对话框对象并d出对话框的,鸡啄米下面给出这段代码并加以注释:
C++代码
CAdditionDlg dlg // 定义对话框类CAdditionDlg的对象dlg
m_pMainWnd = &dlg // 将dlg设为主窗口
INT_PTR nResponse = dlg.DoModal() // d出对话框dlg,并将DoModal函数的返回值(退出时点击按钮的ID)赋值给nResponse
if (nResponse == IDOK) // 判断返回值是否为OK按钮(其ID为IDOK,鸡啄米已经将它删除)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL) // 判断返回值是否为Cancel按钮(其ID为IDCANCEL,鸡啄米将它的Caption改为了逗退出地)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
d出对话框比较关键的一个函数,就是对话框类的DoModal()函数。CDialog::DoModal()函数的原型为:
virtual INT_PTR DoModal()
返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nResult参数值。如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
调用了它对话框就会d出,返回值是退出对话框时所点的按钮的ID,比如,我们点了逗退出地按钮,那么DoModal返回值为IDCANCEL。
三.添加一个新对话框并d出它
鸡啄米再为加法计算器程序添加一个对话框,以在计算之前询问用户是否确定要进行计算。大家可以完整的看下对话框的添加和d出过程。
1.根据逗创建对话框模板和修改对话框属性地中所讲的方法,在Resource View中的逗Dialog地上点右键选择逗Insert Dialog地,创建一个新的对话框模板,修改其ID为IDD_TIP_DIALOG,Caption改为逗提示地,然后参考逗为对话框添加控件地中所讲,在对话框模板上添加一个静态文本框(static text),Caption改为逗您确定要进行加法计算吗看地,接下来修改OK按钮的Caption为逗确定地,Cancel按钮的Caption为逗取消地,最后调整各个控件的位置和对话框的大小。最终的对话框模板如下图:
2.根据逗创建对话框类和添毕雀御加控件变量地中创建对话框类的方法,在对话框模板上点右键选择逗Add Class...地,d出添加类的对话框,设置逗Class name地为CTipDlg,点逗OK地。在Solution Explorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。
3.我们要在点逗计算地按钮之后d出此提示对话框,那么就要在逗计算地按钮的消息处理函数OnBnClickedAddButton()中访问提示对话框类,所以为了访问CTipDlg类,在AdditionDlg.cpp中包含CTipDlg的头文件:#include "TipDlg.h"。
4.修改OnBnClickedAddButton()的函数体,在所有代码前,构造CTipDlg类的对象tipDlg,并通过语句tipDlg.DoModal()d出对话框,最后判断DoModal()函数的返回值是IDOK还是IDCANCEL来确定是否继续进行计算。OnBnClickedAddButton()函数修改后如下:
C++代码
void CAdditionDlg::OnBnClickedAddButton()
{
// TODO: Add your control notification handler code here
INT_PTR nRes// 用于保存DoModal函数的返回值
CTipDlg tipDlg // 构造对话框类CTipDlg的实例
nRes = tipDlg.DoModal() // d出对话框
if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行
return
// 将各控件中的数据保存到相应的变量
UpdateData(TRUE)
// 将被加数和加数的加和赋值给m_editSum
m_editSum = m_editSummand + m_editAddend
// 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值
UpdateData(FALSE)
}
5.测试。编译运行程序后,在对话框上输入被加数和加数,点逗计算地,d出提示对话框询问是否进行计算,如果选择逗确定地,则提示对话框退出,并在主对话框上显示被加数和加数的和,而如果选择逗取消地,则提示对话框也会退出,但主对话框显示的和不变,即没有进行加法计算。
有碰铅返办法!! 使用非模态对话笑饥框...假设你要显示的对话框的类名为: CNewDlg
首先: 在主窗口的头文件中做提前声明 class CNewDlg
为主窗口类添加成员变量: CNewDlg *m_pDlg
在主窗口构造函数中复初值: m_pDlg = new CNewDlg(this)
其次: 在需要d出该窗口的地方加入代码:
if (m_pDlg->GetSafeHwnd()==0)
{
m_pDlg->Create() //注意:非模态对话框必须调激和用Create创建产生(原因参见实验指导书P65)
}
else
{
m_pDlg->SetActiveWindow()
}
最后: 就是销毁窗口了.
非模态对话框必须使用函数DestroyWindow()来销毁窗口. 这个工作,最好通过下面的步骤来做:
对CNewDlg类响应 IDOK 消息. 在消息响应函数中, 发送一个自定义消息给m_pDlg 父窗口, 也就是
你的主窗口, 在主窗口中对消息进行响应, 执行代码: m_pDlg->DestroyWindow()即可.
还需要在主对话框的析构函数中进行资源的释放:
delete m_pDlg
希望对你能有帮助..如果不会添加自定义消息,随时可以联系我....
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)