模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口。例子:在桌面上右击我的电脑,选择属性,弹出系统属性窗口,点击下面的技术支持,弹出技术支持信息,现在再对系统属性窗口进行操作就操作不了,这种叫做模式对话框;关闭技术支持信息,在系统属性里选择硬件,点击设备管理器,弹出设备管理器窗口,现在再对系统属性窗口进行操作仍然可以操作,这种就叫做非模式对话框。
1.创建一个基于对话框的应用程序;
2.创建一个新的对话框:

同时修改对话框的ID为IDD_MY_DIALOG,为该对话框添加类 在该对话框上右击:

3.在原来自带的对话框ModelssDialogDlg类,也就是主对话框类中添加变量:

并在头文件ModelessDialogDlg.h 中添加
#include "MyDialog.h"
4.在ModelessDialogDlg.cpp中的构造函数初始化:
CModelessDialogDlg::CModelessDialogDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CModelessDialogDlg::IDD, pParent)
, m_pMyDialog(NULL)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pMyDialog = NULL; //初始化新建对话框
}
并添加析构函数:
CModelessDialogDlg::~CModelessDialogDlg(){
if(m_pMyDialog != NULL){
delete m_pMyDialog;
}
}
5.在主窗口中添加按钮,双击添加处理函数:
void CModelessDialogDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//如果是第一次显示,则先创建
if(m_pMyDialog == NULL)
{
m_pMyDialog = new CMyDialog();
m_pMyDialog->Create(IDD_MY_DIALOG);
}
m_pMyDialog->ShowWindow(SW_NORMAL);
}
程序运行结果:
