非模态对话框的创建及使用

在开始本文之前,假设我已经派生了一个对话框类CMyDlg。

对于模态对话框,使用非常简单,通常会像以下这样使用:

void Fun()

{

...............

CMyDlg mydlg;

mydlg.DoModal();

................

}

而对于非模态对话框,通常会像以下这样使用

void Fun()

{

...............

CMyDlg*  pMydlg = new CMyDlg;

pMydlg->Create( IDC_MY_DLG );

pMydlg->ShowWindow( SW_SHOW );

................

}

因为非模态对话框是new出来的,所以要释放对象。

微软的建议是:

A modal dialog box closes automatically when the user presses the OK or Cancel buttons or when your code calls theEndDialog member function.

When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don’t call the base class CDialog::OnCancel,
because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes in order
to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.

所以我们也按照他们的建议进行操作,

void CMyDlg::OnOK()
{
	// TODO: 在此添加专用代码和/或调用基类
	DestroyWindow();

	return;
	//CDialogEx::OnOK();
}

void CMyDlg::OnCancel()
{
	// TODO: 在此添加专用代码和/或调用基类

	DestroyWindow();

	return;
	//CDialogEx::OnCancel();
}

void CMyDlg::PostNcDestroy()
{
	// TODO: 在此添加专用代码和/或调用基类
	CDialogEx::PostNcDestroy();

	delete this;
} 

注:如果你不是像以上那样临时new一个的话,比如你可能会让它成为一个类成员对象,然后在初始化的时间创建它,在类销毁时自动销毁此模态对话框的话,那么就不应该在PostNcDestroy处delete它,也不应当DestroyWindow()它,会引发内存操作错误。因为此时它并不是new出来的。比如:在类A中有一个成员变量为CMyDlg
m_mMyDlg;  然后在类构造函数中调用m_mMyDlg.Create( IDC_MY_DLG);

作者:山丘儿

转载请标明出处,谢谢。原文地址:http://blog.csdn.net/s634772208/article/details/46404761

时间: 2024-08-01 10:42:15

非模态对话框的创建及使用的相关文章

VS2010/MFC对话框:非模态对话框的创建及显示

非模态对话框的创建及显示 上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将上一讲中创建的Tip模态对话框改为非模态对话框,让大家看下效果. 非模态对话框的对话框资源和对话框类 实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,所以上一讲中创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改. 创建及显示非模态

显示模态模态对话框和非模态对话框

模态对话框类和非模态对话框类的创建是一样的,也就是说当有一个对话框类(假设名称为CMyDialog),既可以用它来创建模态对话框实例并显示, 也可以用它来创建非模态对话框实例显示. 1.创建模态对话框实例并显示 CMyDialog   Dlg : Dlg.DoModal(): 也就是说只需要调用对话框类的DoModal()即可实现创建并显示模态对话框. 2.创建非模态对话框实例并显示 方法一:设使用CMyDialog类的CUser,定义和实现CUser的文件分别是 User.h和User.cpp

模态对话框与非模态对话框

①.区别 模态对话框:创建后,程序的其他窗口便不能进行操作,必须将该窗口关闭后,其他窗口才能进行操作.------父线程阻塞,子线程运行 非模态对话框:无需像模态对话框那样,它不强制要求用户立即反应,而是与其他窗口同时接受用户操作.-----父子线程同时运行 ②.添加资源与类绑定 资源窗口添加Dlg资源,Dlg窗口右键Add Class 绑定类.选择继承类 CDialog. ②.对话框创建与显示 模态对话框:CDialog::DoModal CMyDialog dlg;//继承CDialog类的

MFC单文档下使用非模态对话框

由于自己写的程序是自动获取桌面实时图像,所以用模态对话框导致程序出错,目前粗鄙的理解是模态对话框会让对话框所在线程暂停,当关闭对话框后才能继续操作,而非模态对话框可以不必让程序暂停. 下面记录非模态对话框的创建过程: 1 在单文档中新建一个对话框资源并生成对话框类 CRadiusDlg 2 在视图类C**view.cpp中添加对话框的头文件,并添加一个对话框类的指针变量CRadiusDlg *pModalessDlg; 3 在菜单栏添加一个用于显示对话框的菜单项,并在响应事件处,添加事件处理代码

mfc非模态对话框

按照我们的之前的做法,先新建工程. 把基本的内容都添加上. 形成这样一个样子: 并且进行试运行,让程序能够完成加法运算. 值的注意的是,静态文本那里要改一下名字,否则无法将成员变量进行添加. 前期准备: 然后就可以开始做我们的非模态对话框了. 一.创建这样一个对话框 到资源视图下面的,找到Dialog右击,出现下拉菜单.点击插入Dialog. 这步,应该都很熟练,先拖动两个按钮(否则可能会发生问题),然后稍微调整对话框的大小,最后添加一个静态文本.输入一些文字. 二.右键当前对话框,然后找到添加

VC++模态对话框和非模态对话框

MFC中有两种类型的对话框:模态对话框和非模态对话框. 模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务.非模态对话框是指当其显示时,允许转而执行程序中其他任务,而不用关闭这个对话框. 模态对话框的创建:创建模态对话框需要调用CDialog类的成员函数:DoModal,该函数的功能是创建并显示一个模态对话框,其返回值将作为CDialog类的另一个成员函数:EndDialog的参数,后者的功能是关闭模态对话框.一般显示模态对话框的实现代码如下: voi

vc创建模态和非模态对话框

模态对话框的创建 创建模态对话框需要调用CDialog类的成员函数:DoModal,该函数的功能就是创建并显示一个模 态对话框,关闭模态对话框的函数是EndDialog,该函数需要一个参数,这个参数就是DoModal 函数的返回值. CTestDlg dlg;    dlg.DoModal();   //打开模态对话框 dlg.EndDialog(IDOK);//关闭模态对话框,相当于在模态对话框上点击了“确定”按钮 创建非模态对话框创建非模态对话框需要利用CDialog类的Create成员函数

创建模态,非模态对话框

创建模态对话框 还要先包含新窗口窗口的头文件. CTestDlg dlg; CTestDlg=新创建的窗口类名 dlg.Domodal(); 创建非模态对话框 CTestDlg *pdlg=new CTestDlg; 最好在把 CTestDlg *pdlg=new CTestDlg;定义在视窗类构造函数 然后析构函数释放内存 pdlg->Create(IDD_DIALOG1,this); pdlg->ShowWindow(SW_SHOW);

QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例

QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例 部分代码: // 创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束 QMenu *pDialog = mBar->addMenu(QString::fromLocal8Bit("对话框")); QAction *pTopDialog = pDialog->addAction(QString::fromLocal8Bit("模态对话框")); connect(pTopDialog,