MFC学习笔记(四)- 模态对话框与非模态对话框的创建与显示

首先说一下两种对话框的区别:
1、从实现效果来说:模态对话框弹出后,主对话框不能进行下一步操作,必须等子对话框执行完毕;而非模态对话框弹出后仍不会影响主对话框的操作。
2、从实现原理来说:模态对话框是在主对话框的 .cpp 文件中,添加子对话框头文件,并在需要弹出对话框时实例化对象并显示;非模态对话框需要在主对话框的 .h 文件中,添加子对话框头文件,在主对话框的 .h 文件中添加 private 成员变量,类型为子对话框类指针,然后在需要弹出对话框时申请动态内存。
3、注意:因为非模态对话框的实现涉及到动态内存,所以切记在构造函数中初始化指针值为 “NULL”,在析构函数中 delete 指针变量。


示例:
1、我的对话框类(此处不再赘述关于类的添加等操作):
主对话框,添加类为”CChid_WindowDlg”
这里写图片描述

子对话框,添加类为”CRemind”
这里写图片描述
我会在主对话框点击“计算”之后弹出子对话框“提示”
2、代码实现:
- 模态对话框

//CChild_WindowDlg.cpp

#include "Remind.h"
void CChild_WindowDlg::OnBnClickedOk()
{
    CRemind m_remind;
    INT_PTR m_result = m_remind.DoModal();     //DoModal()函数用于显示对话框,返回值为关闭对话框点击控件的ID
    if (m_result == IDOK)         //如果我退出子对话框点击了ID为"IDOK"的控件,就是子对话框中“确认”控件,则进行计算
    {
        UpdateData(true);
        m_sum = m_left + m_right;
        UpdateData(false);
    }
}
  • 非模态对话框
//CChild_WindowDlg.h
#include "Remind.h"
class CChild_WindowDlg: public CDialogEx
{
    //一大堆成员
    private:
        CRemind * m_remind;
};
//CChild_WindowDlg.cpp

//构造函数中初始化
CChid_WindowDlg::CChild_WindowDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_CHID_WINDOW_DIALOG, pParent)
    , m_left(0)
    , m_right(0)
    , m_sum(0)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_remind = NULL;
}

//析构函数释放内存
CChid_WindowDlg::~CChild_WindowDlg()
{
    if (m_remind != NULL)
        delete m_remind;
}

//具体实现
void CChild_WindowDlg::OnBnClickedOk()
{
    if (m_remind == NULL)
    {
        m_remind = new CRemind;
        m_remind->Create(IDD_REMIND, this);       //IDD_REMIND 是我的子对话框的ID
    }
    m_remind->ShowWindow(SW_SHOW);         //显示子对话框
    UpdateData(true);
    m_sum = m_left + m_right;
    UpdateData(false);
}

关于Updatedata()的用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值