MFC——模态对话框和非模态对话框

一、模态对话框

如果你需要做一个模态对话框,简单的说就是你点一个按钮,弹出一个对话框,之后你只能在弹出的对话框上操作的这么一个过程。实验的过程很简单,跟着我做吧。

下面开始模态对话框实验

  1. 在资源视图新建一个对话框资源,修改其ID为IDD_DIALOG1,这个就是即将要弹出来的对话框

  2. 在这个对话框模板上点右键选择“Add Class…”,弹出添加类的对话框,设置“Class name”为CTestDlg,点“OK”。在Solution Explorer中可以看到生成了CTestDlg类的头文件TestDlg.h和源文件TestDlg.cpp

  3. 假设你想点击ID为IDC_BUTTON1的按钮后弹出上面建立的对话框,你就需要双击IDC_BUTTON1这个按钮,在它的消息相应函数中执行弹出的过程,下面是具体的方法。

  4. 因为你要访问CTestDlg类,所以要在 工程Dlg.cpp 文件中包含CTestDlg的头文件:#include “TestDlg.h”

  5. 添加好头文件后,修改IDC_BUTTON1的消息响应函数,如下所示:

void CMFCApplication1Dlg::OnBnClickedButton1()
{
    // TODO:  在此添加控件通知处理程序代码
    INT_PTR nRes;             // 用于保存DoModal函数的返回值   

    CTestDlg testDlg;           // 构造对话框类CTipDlg的实例   
    nRes = testDlg.DoModal();  // 弹出对话框   
    if (IDCANCEL == nRes)     // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行   
        return;
}
  1. 编译,点击那个button1,你就会发现弹出了你做的对话框

二、非模态对话框

如果你需要做一个非模态对话框,简单的说就是你点一个按钮,弹出一个对话框,之后你还能在原对话框上操作的这么一个过程。实验的过程也很简单,跟着我做吧。

  1. 在资源视图新建一个对话框资源,修改其ID为IDD_DIALOG1,这个就是即将要弹出来的对话框

  2. 在这个对话框模板上点右键选择“Add Class…”,弹出添加类的对话框,设置“Class name”为CTestDlg,点“OK”。在Solution Explorer中可以看到生成了CTestDlg类的头文件TestDlg.h和源文件TestDlg.cpp

  3. 在AdditionDlg.h中添加#include “TestDlg.h”,这是因为我们需要在工程Dlg.h中定义CTestDlg类型的指针变量,所以要先包含它的头文件;然后在 工程Dlg.h 中添加private成员变量CTestDlg *m_pTestDlg;

  4. 在CAdditionDlg类的构造函数中初始化成员变量m_pTestDlg。加入

m_pTestDlg = NULL;
  1. 修改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);
}
  1. 最后,在 工程Dlg.h文件中为CAdditionDlg添加析构函数声明:

~C工程Dlg();

然后在AdditionDlg.cpp文件中添加析构函数的实现,函数体如下:

C工程Dlg::~C工程Dlg()
{
    // 如果非模态对话框已经创建则删除它   
    if (NULL != m_pTestDlg)
    {
        // 删除非模态对话框对象   
        delete m_pTestDlg;
    }
}

效果如下
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CSDN_dzh/article/details/83244441