您的位置:首页 > 其它

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

2018-02-28 12:02 337 查看
首先说一下两种对话框的区别:

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()的用法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐