MFC学习笔记(一):模态对话框与非模态对话框的区别、创建及显示

一、区别

Windows对话框分为两类:模态对话框非模态对话框

        (1) 模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。

       (2) 非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等

二、对话框的弹出原理

        打开Xxxxxxxx.cpp文件,可以看到CXxxxxxxApp类有个InitInstance()函数,InitInstance()函数的后半部分有一段代码就是定义对话框对象并弹出对话框的:

CXxxxxxxxDlg dlg;     // 定义对话框类CXxxxxxxxDlg的对象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)   
{   
    // 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。


三、模态对话框的创建与显示

        1、创建对话框模板,修改ID并调整。在对话框模板上点右键选择“Add Class...”,弹出添加类的对话框,设置“Class name”为CTipDlg,点“OK”。在Solution Explorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。
        2、我们要在点“XX”按钮之后弹出此提示对话框,那么就要在“XX”按钮的消息处理函数OnBnClickedXXButton()中访问提示对话框类,所以为了访问CTipDlg类,在XxxxxxxDlg.cpp中包含CTipDlg的头文件:#include "TipDlg.h"。
        3、修改OnBnClickedXXButton()的函数体,在所有代码前,构造CTipDlg类的对象tipDlg,并通过语句tipDlg.DoModal();弹出对话框,最后判断DoModal()函数的返回值IDOK 还是 IDCANCEL 来确定是否继续进行计算。OnBnClickedXXButton()函数修改后如下:

void CXxxxxxxxDlg::OnBnClickedXXButton()   
{   
    // TODO: Add your control notification handler code here   
    INT_PTR nRes;             // 用于保存DoModal函数的返回值   
  
    CTipDlg tipDlg;           // 构造对话框类CTipDlg的实例   
    nRes = tipDlg.DoModal();  // 弹出对话框   
    if (IDCANCEL == nRes)     // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行   
        return;   
  
    ......   
}
        4、测试。编译运行程序后,在对话框上输入数据,点“XX”,弹出提示对话框询问,如果选择“确定”,则提示对话框退出,并在主对话框上显示相应的结果,而如果选择“取消”,则提示对话框也会退出,但主对话框显示数据不变。


四、非模态对话框的创建与显示

        实际上,模态对话框和非模态对话框在创建对话框资源生成对话框类上是没有区别的,所以上面在模态对话框中创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改,需要修改的是,对话框类实例的创建和显示,也就是之前在CXxxxxxxxDlg::OnBnClickedXXButton()函数体中添加的对话框显示代码。

        1、在XxxxxxxxDlg.h中包含CTipDlg头文件并定义CTipDlg类型的指针成员变量。详细操作方法是,在XxxxxxxxDlg.cpp中删除之前添加的#include "TipDlg.h",而在XxxxxxxxDlg.h中添加#include "TipDlg.h",这是因为我们需要在XxxxxxxxDlg.h中定义CTipDlg类型的指针变量,所以要先包含它的头文件;然后在XxxxxxxxDlg.h中为CXxxxxxxxDlg类添加private成员变量CTipDlg  *m_pTipDlg;  。

        2、在CXxxxxxxxDlg类的构造函数中初始化成员变量m_pTipDlg。如果cpp文件中函数太多,可以在Class View上半个视图中找到CAdditionDlg类,再在下半个视图中找到其构造函数双击,中间客户区域即可马上切到构造函数的实现处。在构造函数体中添加m_pTipDlg = NULL;,这是个好习惯,在任何指针变量使用前都初始化,可以避免因误访问重要内存地址而破坏此地址的数据。

        3、将上面添加的模态对话框显示代码注释或删除掉,添加非模态对话框的创建和显示代码。修改后的CXxxxxxxxDlg::OnBnClickedXXButton()函数如下:

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);   
  
    ......
}

       4、因为此非模态对话框实例是动态创建的,所以需要手动删除此动态对象来销毁对话框。在CXxxxxxxxDlg类的析构函数中添加删除代码,但是MFC并没有自动给出析构函数,这时需要我们手动添加,在对话框对象析构时就会调用我们自定义的析构函数了。在XxxxxxxxDlg.h文件中为CXxxxxxxxDlg添加析构函数声明:~CAdditionDlg();,然后在XxxxxxxxDlg.cpp文件中添加析构函数的实现,函数体如下:

CAdditionDlg::~CAdditionDlg()   
{   
    // 如果非模态对话框已经创建则删除它   
    if (NULL != m_pTipDlg)   
    {   
        // 删除非模态对话框对象   
        delete m_pTipDlg;   
    }   
}
        这样,非模态对话框创建和显示的代码就添加修改完了。在对话框上输入数据,然后点“XX”按钮,依然像上节一样弹出了提示对话框,但是先不要关闭它,拖动它后面的主对话框,发现主对话框竟然可以拖动了,而且结果编辑框里已经显示了结果,这表明提示对话框显示以后还没有关闭,OnBnClickedXXButton() 就继续向下执行了,不仅如此,主对话框每个编辑框还都可以响应输入。





以上内容整理转载自:鸡啄米(感谢大神的教程指导)

        (1)模态对话框:http://www.jizhuomi.com/software/160.html

        (2)非模态对话框:http://www.jizhuomi.com/software/162.html


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值