MFC创建模态对话框和非模态对话框的方法_C 语言

在MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box)。本文对此分别简述其创建方法。

一、模态对话框(model dialog box)

在程序运行的过程中,若出现了模态对话框,那么主窗口将无法发送消息,直到模态对话框退出才可以发送。
点击模态对话框中的OK按钮,模态对话框会被销毁。
创建一个模态对话框的代码如下所示:

//创建一个模态对话框
CTestDialog td;
td.DoModal(); 

其中CTestDialog为我自己所新建的和一个对话框资源相关联的对话框类。
可以创建一个布局模态对话框类变量,不用担心它会随着所在函数返回而被销毁。因为DoModal()函数的一个功能是,当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行。
DoModal()函数也有显示对话框的功能,所以也无需调用其他函数来显示对话框。

二、非模态对话框(modaless dialog box)

在程序运行的过程中,若出现了非模态对话框,主窗口还可以发送消息。
点击非模态对话框中的OK按钮,非模态对话框没有销毁,只是隐藏了。若想点击OK按钮时,非模态对话框也销毁,那么CTestDialog类必须重载其基类CDialog的虚函数OnOK(),在此函数里调用DestroyWindow()来销毁此对话框。

此处采用和上面一样的方式来创建一个非模态对话框,代码如下:

CTestDialog td;
td.Create(IDD_DIALOG1); //创建一个非模态对话框
td.ShowWindow(SW_SHOWNORMAL); //显示非模态对话框

那么,在运行时,你会发现此对话框无法显示。这是因为你声明的对话框变量td是局部变量,但这个函数返回时,td也被析构了,所以无法显示此对话框。

创建非模态对话框,必须声明一个指向CTestDialog类的指针变量,且需要显示的调用ShowWindow()才能将对话框显示出来。有两种创建方法:

(1)采用局部变量创建一个非模态对话框

//采用局部变量创建一个非模态对话框
CTestDialog *pTD = new CTestDialog();
pTD->Create(IDD_DIALOG1); //创建一个非模态对话框
pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框

因为指针在声明的时候是被放在堆栈中,只有整个应用程序关闭后才会被销毁,所以可以正常显示对话框。
这种方法虽然不影响程序的运行,可是指针pTD所指向的内存却导致不可用,这样的编程很不好。

(2)采用成员变量创建一个非模态对话框
首先在你所要编写的类的头文件中声明一个指针变量:

private:
CTestDialog *pTD;

然后再在相应的CPP文件,在你要创建对话框的位置添加如下代码:

//采用成员变量创建一个非模态对话框
pTD = new CTestDialog(); //给指针分配内存
pTD->Create(IDD_DIALOG1); //创建一个非模态对话框
pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框

最后在所在类的析构函数中收回pTD所指向的内存:

delete pTD;

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索非模态对话框
, mfc
, 方法
, 创建
模态对话框
mfc创建非模态对话框、mfc创建模态对话框、mfc 非模态对话框、mfc模态对话框、mfc非模态对话框销毁,以便于您获取更多的相关知识。

时间: 2024-09-25 05:28:20

MFC创建模态对话框和非模态对话框的方法_C 语言的相关文章

基于对话框程序中让对话框捕获WM_KEYDOWN消息的实现方法_C 语言

在对话框程序中,我们经常是利用对话框上的子控件进行命令响应来处理一些事件.如果我们想要让对话框(子控件的父窗口)类来响应我们的按键消息,我们可以通过ClassWizard对WM_KEYDOWN消息进行响应,当程序运行后,我们按下键盘上的按键,但对话框不会有任何的反应.这是因为在对话框程序中,某些特定的消息,例如按键消息,它们被Windows内部的对话框过程处理了(即在基类中完成了处理,有兴趣的读者可以查看MFC的源代码),或者被发送给子控件进行处理,所以我们在对话框类中就捕获不到按键的消息了.

Mfc在模态对话框上非模态创建listbox焦点问题

问题描述 Mfc在模态对话框上非模态创建listbox焦点问题 在模态对话框上创建一个Gridctrl中每一个Row里会有一个item里additem了一个非模太的listbox控件,在响应item左键单击后会show出这个listbox在listbox的show函数里setfocys一直不起作用,发现焦点一直在最最外层的Dlg里,怎么能够把焦点设置到listbox上 解决方案 看看是不是忘记设置tabstop了.手工按tab有反应么?setfocus的handle参数是否正确. 解决方案二:

VC MFC非模态对话框的实现方法_C 语言

众所周知的,MFC中非模态对话框在显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.本文就来给大家讲解一下非模态对话框的实现方法: 一.非模态对话框的对话框资源和对话框类 实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,因此,在创建模态对话框时所创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改. 二.创建及显示非模态对话框的步骤 需要修改的是,对话框类实例的创建和显示,也就是之前在CAdditionDlg::OnBnCli

VC 如何实现将创建的多个非模态对话框合并在一个对话框中(像QQ聊天室一样)?

问题描述 VC 如何实现将创建的多个非模态对话框合并在一个对话框中(像QQ聊天室一样)? //点击该按钮创建子窗口61 void CCDockDlgDlg::OnBtnCrtdlg() { // TODO: Add your control notification handler code here CChildDlg *dlg_Child = new CChildDlg; dlg_Child->Create(IDD_CHILD_DLG); dlg_Child->ShowWindow(SW_

模态对话框和非模态对话框11111111

问题描述 模态对话框和非模态对话框11111111 我之前用(dlg.domodal==idok)创建的模态对话框,后来我想把他改成费模态的 但是我应该是用什么语句 使我单击非模态对话框上的"确定"来获取对话框中的内容呢 解决方案 楼主,你是不是想问如何在主对话框中收到点击了非模态对话框的确定 解决方案二: 楼主,你是不是想问如何在主对话框中收到点击了非模态对话框的确定 解决方案三: 点击确定按钮,向主对话框发送一个自定义消息. 在主对话框相应该消息. 解决方案四: 模态对话框的处理方

js 模式窗口(模式对话框和非模式对话框)的使用介绍_基础知识

Javascript里面分模式对话框和非模式对话框,其实两者区别就是在对话框被关闭之前用户能否在同一页面的其他地方进行工作.比如"打开文件"对话框便是典型的模式对话框,在你对这个对话框做出动作才能对打开该对话框的程序进行其他操作,而非模式对话框则不必. 模式对话框:showModalDialog 非模式对话框:showModelessDialog vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures]

MFC调用模态对话框和非模态对话框的方式

1.调用模态的对话框void ADlg:: Button(){BDlg bdlg;bdlg.DoModal();}2.调用非模态的对话框在 Adlg.h 包含 Bdlg.h头文件中定义BDlg* m_pdblg; 在Adlg.cpp中在构造函数中初始化m_pdblg = NULL;在析构函数中if(m_pdblg != NULL){delete m_pdblg;} 在单击按钮中void ADlg:: Button(){m_pdblg = new BDlg;m_pdblg->Create(IDD_

模态对话框与非模态对话的销毁方法与区别

前几天发现自己的程序中使用非模态对话框,Debug版本有警告提示如下: Warning: calling DestroyWindow in CWnd::~CWnd OnDestroy or PostNcDestroy in derived class will not be called 由于是Warnning,就没有太在意,后来随意上网一找发现,这个问题还是很严重的问题. 最后,发现有些基本问题我还没有搞清楚.同时在这个过程中,也学习了不少新东西,网上关于这个问题的资料很多,感觉真正把问题讲清

JS 模态对话框和非模态对话框操作技巧汇总_基础知识

模态窗口 javascript 技巧汇总(传值.打开.刷新) 1.要弹出的页面中,一定要保证<head></head>标签间有<base target="_self">,否则会弹出的模态窗口上,点击按钮时,会再次弹出一个新页面. 2.被弹出页面的按钮的事件处理中,应该有Response.Write(new Function().ClosePage());语句,用以关闭当前的模态窗口. 3.因为幽默的缓存原因,如果你在模态窗口中修改了数据,你会发现,父