首先说一下两种对话框的区别:
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);
}