MFC——模态对话框和非模态对话框
一、模态对话框
如果你需要做一个模态对话框,简单的说就是你点一个按钮,弹出一个对话框,之后你只能在弹出的对话框上操作的这么一个过程。实验的过程很简单,跟着我做吧。
下面开始模态对话框实验
-
在资源视图新建一个对话框资源,修改其ID为IDD_DIALOG1,这个就是即将要弹出来的对话框
-
在这个对话框模板上点右键选择“Add Class…”,弹出添加类的对话框,设置“Class name”为CTestDlg,点“OK”。在Solution Explorer中可以看到生成了CTestDlg类的头文件TestDlg.h和源文件TestDlg.cpp
-
假设你想点击ID为IDC_BUTTON1的按钮后弹出上面建立的对话框,你就需要双击IDC_BUTTON1这个按钮,在它的消息相应函数中执行弹出的过程,下面是具体的方法。
-
因为你要访问CTestDlg类,所以要在 工程Dlg.cpp 文件中包含CTestDlg的头文件:#include “TestDlg.h”
-
添加好头文件后,修改IDC_BUTTON1的消息响应函数,如下所示:
void CMFCApplication1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
INT_PTR nRes; // 用于保存DoModal函数的返回值
CTestDlg testDlg; // 构造对话框类CTipDlg的实例
nRes = testDlg.DoModal(); // 弹出对话框
if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行
return;
}
- 编译,点击那个button1,你就会发现弹出了你做的对话框
二、非模态对话框
如果你需要做一个非模态对话框,简单的说就是你点一个按钮,弹出一个对话框,之后你还能在原对话框上操作的这么一个过程。实验的过程也很简单,跟着我做吧。
-
在资源视图新建一个对话框资源,修改其ID为IDD_DIALOG1,这个就是即将要弹出来的对话框
-
在这个对话框模板上点右键选择“Add Class…”,弹出添加类的对话框,设置“Class name”为CTestDlg,点“OK”。在Solution Explorer中可以看到生成了CTestDlg类的头文件TestDlg.h和源文件TestDlg.cpp
-
在AdditionDlg.h中添加#include “TestDlg.h”,这是因为我们需要在工程Dlg.h中定义CTestDlg类型的指针变量,所以要先包含它的头文件;然后在 工程Dlg.h 中添加private成员变量CTestDlg *m_pTestDlg;
-
在CAdditionDlg类的构造函数中初始化成员变量m_pTestDlg。加入
m_pTestDlg = NULL;
- 修改button1的消息响应函数,如下
void CMy2_MFCTempDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if (NULL == m_pTestDlg)
{
// 创建非模态对话框实例
m_pTestDlg = new CTestDlg();
m_pTestDlg->Create(IDD_DIALOG1, this);
}
// 显示非模态对话框
m_pTestDlg->ShowWindow(SW_SHOW);
}
- 最后,在 工程Dlg.h文件中为CAdditionDlg添加析构函数声明:
~C工程Dlg();
然后在AdditionDlg.cpp文件中添加析构函数的实现,函数体如下:
C工程Dlg::~C工程Dlg()
{
// 如果非模态对话框已经创建则删除它
if (NULL != m_pTestDlg)
{
// 删除非模态对话框对象
delete m_pTestDlg;
}
}
效果如下