DoModal()函数

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

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

VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)

       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按钮(其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。

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

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

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

VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)

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

}

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值