MFC中或者说Windows系统中,对话框主要分为两种:模态对话框和非模态对话框。
今天就浅谈两种对话框的创建流程与弹出流程。
看了这篇文章之后,想必创建两种对话框是完全没有问题的。
说通俗点就是,当对话框点开之后,我们能不能操作其他对话框,就是区分的条件。
如果能,则是非模态对话框,即证明焦点不固定在当前打开对话框。
如果不能,则是模态对话框,即证明焦点固定在了当前打开对话框。
这里我贴上我以前的一片博客,上面有创建步骤,但是当初搞太快,发现有一张图片是放错了,但是关系不大,按照步骤来,你们同样可以做出一样的效果。
https://blog.csdn.net/m0_43458204/article/details/106389789
既然是聊弹出方式,因为当时我们并没有操作他,而是直接MFC自动生成的,所以这里贴上MFC的弹出过程源码,一起来看看。
当我们创建一个基于对话框的项目时,会自动生成一个某某莫APP类,这个名字是你们自己命名的。
我们进入这个类的.cpp中,找到InitInstance()函数。
查找函数的方式:下拉框式查找函数。
步骤如下:
1.点击工具,然后点击最后一个选项。
2.进入选项之后点击文本编辑器,下拉到最后,点击所有语言,选择常规,旁边有一个导航栏,勾选中即可。
3.退出设置界面,代码区域header部分就会有一行三选项的下拉框,在最后一个找InitInstance()函数即可。如果没有选项,则调整前面两个下拉框,选择定位在全局还是其他位置。
InitInstance()函数C++代码如下:
CAdditionDlg dlg; // 定义对话框类CAdditionDlg的对象dlg
m_pMainWnd = &dlg; // 将dlg设为主窗口
INT_PTR nResponse = dlg.DoModal(); // 弹出对话框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
}
弹出对话框比较关键的一个函数,就是对话框类的DoModal()函数。CDialog::DoModal()函数的原型为:
virtual INT_PTR DoModal();
返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nResult参数值。如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
调用了它对话框就会弹出,返回值是退出对话框时所点的按钮的ID,比如,我们点了“退出”按钮,那么DoModal返回值为IDCANCEL。
这里为了能让各位看见整个过程,我重新建一个对话框。
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;
// 将各控件中的数据保存到相应的变量
UpdateData(TRUE);
// 将被加数和加数的加和赋值给m_editSum
m_editSum = m_editSummand + m_editAddend;
// 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值
UpdateData(FALSE);
}
实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,所以上一讲中创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改。
需要修改的是,对话框类实例的创建和显示,也就是之前在CAdditionDlg::OnBnClickedAddButton()函数体中添加的对话框显示代码。下面是具体步骤:
C++代码如下:
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);
}
CAdditionDlg::~CAdditionDlg()
{
// 如果非模态对话框已经创建则删除它
if (NULL != m_pTipDlg)
{
// 删除非模态对话框对象
delete m_pTipDlg;
}
}
这样,非模态对话框创建和显示的代码就添加修改完了。让我们运行下看看效果吧。
在加法计算器对话框上输入被加数和加数,然后点“计算”按钮,依然像上节一样弹出了提示对话框,但是先不要关闭它,你可以拖动它后面的加法计算器对话框试试,我们发现加法计算器对话框竟然可以拖动了,而且“和”编辑框里已经显示了运算结果,这表明提示对话框显示以后还没有关闭,OnBnClickedAddButton() 就继续向下执行了,不仅如此,加法计算器的每个编辑框还都可以响应输入。
这只是一个简单的例子,非模态对话框的用处有很多,以后大家在软件开发中会用到。
通过上述的两个例子即概念,想必各位对模态与非模态对话框也有了一定的了解,至少简单的创建,判断是No problem。
这就是暂时对模态对话框与非模态对话框的全部介绍了,如果有什么疑问,可以再评论区或者私信里问我,我看见就会为大家解决。
版权声明:转载请注明出处,谢谢!