zoukankan      html  css  js  c++  java
  • MFC对话框:模态对话框及其弹出过程

    From: http://www.jizhuomi.com/school/c/160.html

    加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益。趁热打铁,鸡啄米这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出。

           .模态对话框和非模态对话框

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

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

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

           大家对Windows系统很了解,相信这两种对话框应该都遇到过。之前的加法计算器对话框其实就是模态对话框。

           .模态对话框是怎样弹出的

           毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚。鸡啄米下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出它,这样大家实践以后就能更灵活的使用模态对话框了。

           大家打开Addition.cpp文件,可以看到CAdditionApp类有个InitInstance()函数,在MFC应用程序框架分析中提到过此函数,不过那是单文档应用程序App类中的,函数体不太相同,但都是进行App类实例的初始化工作。

           InitInstance()函数的后半部分有一段代码就是定义对话框对象并弹出对话框的,鸡啄米下面给出这段代码并加以注释:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    CAdditionDlg dlg;        // 定义对话框类CAdditionDlg的对象dlg   

    m_pMainWnd = &dlg;       // dlg设为主窗口   

    INT_PTR nResponse = dlg.DoModal();   // 弹出对话框dlg,并将DoModal函数的返回值(退出时点击按钮的ID)赋值给nResponse   

    if (nResponse == IDOK)               // 判断返回值是否为OK按钮(其IDIDOK,鸡啄米已经将它删除)   

    {   

        // TODO: Place code here to handle when the dialog is   

        //  dismissed with OK   

    }   

    else if (nResponse == IDCANCEL)      // 判断返回值是否为Cancel按钮(其IDIDCANCEL,鸡啄米将它的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

           .添加一个新对话框并弹出它

           鸡啄米再为加法计算器程序添加一个对话框,以在计算之前询问用户是否确定要进行计算。大家可以完整的看下对话框的添加和弹出过程。

           1.根据"创建对话框模板和修改对话框属性"中所讲的方法,在Resource View中的"Dialog"上点右键选择"Insert Dialog",创建一个新的对话框模板,修改其IDIDD_TIP_DIALOGCaption改为"提示",然后参考"为对话框添加控件"中所讲,在对话框模板上添加一个静态文本框(static text),Caption改为"您确定要进行加法计算吗?",接下来修改OK按钮的Caption"确定"Cancel按钮的Caption"取消",最后调整各个控件的位置和对话框的大小。最终的对话框模板如下图:

           2.根据"创建对话框类和添加控件变量"中创建对话框类的方法,在对话框模板上点右键选择"Add Class...",弹出添加类的对话框,设置"Class name"CTipDlg,点"OK"。在Solution Explorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp

           3.我们要在点"计算"按钮之后弹出此提示对话框,那么就要在"计算"按钮的消息处理函数OnBnClickedAddButton()中访问提示对话框类,所以为了访问CTipDlg类,在AdditionDlg.cpp中包含CTipDlg的头文件:#include "TipDlg.h"

           4.修改OnBnClickedAddButton()的函数体,在所有代码前,构造CTipDlg类的对象tipDlg,并通过语句tipDlg.DoModal();弹出对话框,最后判断DoModal()函数的返回值是IDOK还是IDCANCEL来确定是否继续进行计算。OnBnClickedAddButton()函数修改后如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

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

    }

          5.测试。编译运行程序后,在对话框上输入被加数和加数,点"计算",弹出提示对话框询问是否进行计算,如果选择"确定",则提示对话框退出,并在主对话框上显示被加数和加数的和,而如果选择";取消",则提示对话框也会退出,但主对话框显示的和不变,即没有进行加法计算。

           到此,大家对于模态对话框的基本使用方法应该掌握了吧。希望大家继续关注鸡啄米的MFC教程,我们共同进步。

  • 相关阅读:
    UVALive 7141 BombX
    CodeForces 722D Generating Sets
    CodeForces 722C Destroying Array
    CodeForces 721D Maxim and Array
    CodeForces 721C Journey
    CodeForces 415D Mashmokh and ACM
    CodeForces 718C Sasha and Array
    CodeForces 635C XOR Equation
    CodeForces 631D Messenger
    田忌赛马问题
  • 原文地址:https://www.cnblogs.com/time-is-life/p/8640768.html
Copyright © 2011-2022 走看看