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

在WIN32中,模式对话框的创建一般是使用DialogBox来进行创建的。而非模式对话框则是利用CreateWindow来创建的。在MFC或是WTL中,模式对话框一般是使用DoModal,而非模式对话框的创建则是使用Create。

一、使用中的区别

模式对话框创建后,程序的其他窗口便不能进行操作,必须将该窗口关闭后,其他窗口才能进行操作。而非模式对话框则无需这样,它不强制要求用户立即反应,而是与其他窗口同时接受用户操作。

二、消息响应的区别

在消息响应方面,模式对话框和非模式对话框之间又有着很大的区别。模式对话框工作的时候,它有内部的消息泵机制,控件之间的交互不用我们人为的去控制,系统会帮助我们去处理。非模式对话框则像普通窗口一样,则由WinMain中书写的消息循环驱动。但由于是对话框,它对一些消息有特殊的处理。因此,在消息循环中,需要先对对话框提供截获消息的机会。

While (GetMessage(&msg, NULL, 0, 0))

{

if (hDlgModeless == 0 || !IsDialogMessage(hDlgModeless, &msg))

{

TranslateMessage(&msg);

DispatchMessage( &msg);

}

}

如果当前取得的消息是对话框的消息,IsDialogMessage 将它交由对话消息处理函数处理,并返回TRUE。不需要再派发了。

注意:这个方法并不是很好用,因为当对话框过多的时候,处理起来就比较麻烦了。另一种处理的方法是利用子类化控件的方法,来处理控件间的交互。

三、销毁的区别

模式对话框的销毁是使用EndDialog,而非模式对话框的销毁是使用DestroyWindow.。所以我们在销毁对话框的时候,也要对其进行区别。

非模式对话框,用户关闭对话框时,对话框消息处理函数将收到WM_CLOSE消息,接到后调用DestroyWindow以销毁非模式对话框。

模式对话框,则一般响应IDOK和IDCANCEL。在PPC上,我们对于OK键和X键的处理要注意这点。

四、其他

非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需设置该项风格。更保险的办法是调用ShowWindow(hDialog, SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。 

非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。

通过调用Create函数来启动对话框,而不是DoModal,这是模态对话框的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户的输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。众所周知,在MFC程序中,窗口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对话框对象,而不能以局部变量的形式来构建之。

因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。

必须有一个标志表明非模态对话框是否是打开的。这样做的原因是用户有可能在打开一个模态对话框的情况下,又一次选择打开命令。程序根据 标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指 针赋NULL值,以表明对话框对象已不存在了。

注意:在C++编程中,判断一个位于堆中的对象是否存在的常用方法是判断指向该对象的指针是否为空。这种机制要求程序员将指向该对象的指针初始化为NULL值,在创建对象时将返回的地址赋给该指针,而在删除对象时将该指针置成NULL值。

  模态 非模态
形式上 ①一个模式对话框是一个有系统菜单、标题栏、边线等的弹出式窗口。在创建对话框时指定WS_POPUP, WS_SYSMENU, WS_CAPTION和 DS_MODALFRAME风格。即使没有指定WS_VISIBLE风格,模式对话框也会被显示。

②创建对话框窗口时,将发送WM_INITDIALOG消息(如果指定对话框的DS_SETFONT风格,还有WM_SETFONT消息)给对话框过程。(对话框的窗口过程由Windows系统提供,用户在创建对话框窗口时提供一个对话框过程由窗口过程调用。)

③对话框窗口被创建之后,Windows使得它成为一个激活的窗口,它保持激活直到对话框过程调用::EndDialog函数结束对话框的运行或者Windows激活另一个应用程序为止,在激活时,用户或者应用程序不可以激活它的所属窗口(Owner window)。

①一个无模式对话框是一个有系统菜单、标题栏、边线等的弹出式窗口。在创建对话框模板时指定WS_POPUP、WS_CAPTION、WS_BORDER和WS_SYSMENU风格。如果没有指定WS_VISIBLE风格,无模式对话框不会自动地显示出来。

②一个无模式对话框既不会禁止所属窗口,也不会给它发送消息。当创建一个模式对话框时,Windows使它成为活动窗口,但用户或者程序可以随时改变和设置活动窗口。如果对话框失去激活,那么即使所属窗口是活动的,在Z轴顺序上,它仍然在所属窗口之上。

创建 DoModal() Create()
销毁 一个应用程序通过调用::EndDialog函数来销毁一个模式对话框。一般情况下,当用户从系统菜单里选择了关闭(Close)命令或者按下了确认(OK)或取消(CANCLE)按钮,::EndDialog被对话框过程所调用。调用::EndDialog时,指定其参数nResult的值,Windows将在销毁对话框窗口后返回这个值,一般,程序通过返回值判断对话框窗口是否完成了任务或者被用户取消。

※ EndDialog(IDC_BUTTON_DEFAULT);我们的代码中EndDialog方法在指定的BUTTON处理事件结束时调用,来关闭对话框

在应用程序结束之前,它必须销毁所有的无模式对话框。使用::DestroyWindow销毁一个无模式对话框,不是使用::EndDiaLog。一般来说,对话框过程响应用户输入,如用户选择了“取消”按钮,则自动调用::DestroyWindow;如果用户没有有关动作,则应用程序必须调用::DestroyWindow。
 

模式对话框与非模式对话框的区别2相关推荐

  1. 模式对话框与非模式对话框的区别

    模式对话框与非模式对话框的区别 模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口.例子:在桌面上右击我的电脑,选择属性,弹出系统属性窗口,点击下面的技术支持 ...

  2. 模式对话框和非模式对话框的区别(出自MFC windows程序设计第二版p370)

    模式对话框和非模式对话框的区别:(出自<MFC windows程序设计>第二版p370) 1.显示模式对话框需要调用CDialog::DoModal,而显示无模式对话框则要调用CDialo ...

  3. MFC创建模式对话框与非模式对话框

    一.创建模式对话框 1.分别添加如下三个对话框,其ID分别为IDD_ABOUT.IDD_CHAT.IDD_MFCTEST_DIALOG 双击"关于"按钮,添加相应的消息函数如下: ...

  4. 如何创建MFC模式对话框与非模式对话框

    一.什么是模式对话框与非模式对话框: 简单的来说,模式对话框就是一种当子窗口未关闭时父窗口就无法被激活(也就是处于无法操作状态)的一种窗口.非模式对话框就是当子窗口未关闭时,父窗口依然能被操作的一种窗 ...

  5. MFC—对话框程序—模式对话框与非模式对话框

    一.根据主窗口类型,MFC软件工程可以分为以下几种架构模型: 1.SDI(Single Document Interface):单文档界面,一个主框架窗口下只能编辑一份文档. 例如:记事本和画笔等. ...

  6. 模态对话框和非模态对话框的区别

    模态对话框和非模态对话框的区别 假设对话框类名为:CTestDlg  1,如果是模态对话框: CTestDlg ctd;//创建该对话框对像  ctd.DoModale(); 2,如果是非模态的: C ...

  7. CreateDialog和DialogBox的区别,模态对话框与非模态对话框

    INT_PTR DialogBox(          HINSTANCE hInstance,     LPCTSTR lpTemplate,     HWND hWndParent,     DL ...

  8. PyQt5 模态对话框与非模态对话框的区别

    模态对话框与非模态对话框的区别 记录博文 一.模态对话框 应用程序模态对话框:一旦调用该对话框,它就会成为应用程序唯一能够与用户进行交互的部件.在关闭该对话框之前,用户都不能使用应用程序的其他部件.当 ...

  9. 模态对话框 和 非模态对话框的区别

    模态对话框 出现模态对话框时,主窗口或其他这个程序的窗口将无法进行操作,要等到模态对话框退出才可以操作这个程序的其他窗口. (确保一对一进行反馈) 例如:每次关闭程序时都会弹出的窗口:"1. ...

最新文章

  1. Opencv中除了cv2.cvtColor彩色图转灰度图之外的其他6种方法
  2. mysql,mairadb启动脚本
  3. DataGrid中添加背景
  4. FFMPEG AVDictionary 配置参数
  5. 什么都不说,来4波js
  6. PHP获取字符串的所有子集,PHP Regexp(PCRE)-查找所有子字符串的集合
  7. Ubuntu 下无法Tab键自动补全功能解决办法
  8. WDF框架下 硬盘的虚拟
  9. powerdesigner 数据类型与数据库数据类型对应
  10. dubbo的基于java的路由_1 | Dubbo:探讨标签路由的实现
  11. 51nod1005大数加法(C语言实现大数)
  12. 威纶通触摸屏可以解密吗_【实例】西门子PLC变频器和触摸屏综合应用
  13. 设计院中心所工作流程 CAD广播电视工程工艺绘图
  14. 国美易卡对IP层数据进行处理,国美易卡对TCP/IP的封装
  15. window下编译ffmpeg--mys2下安装对应库编译ffmpeg
  16. fairseq入门教程
  17. git合并多次提交为一次提交
  18. HTTP 状态返回码
  19. C#Winform的DataGridView控件使用详解2—DataGridView表格样式设置及表格操作
  20. 新版RTMP推流协议视频直播点播平台EasyDSS在进行视频直播/录像回看时如何创建视频录像计划?

热门文章

  1. finalshell日志乱码问题_Tomcat乱码问题
  2. jvm内存参数配置_idea中设置JVM参数,简单理解JVM常见参数,JVM调优简单入门
  3. java里冒泡排序编程案例_冒泡排序法-java案例详解
  4. JAVA复习(CharSequence接口、RunTime类、System类、object类中的finalize())
  5. java 树 右键菜单_jQuery实现自定义右键菜单的树状菜单效果
  6. netsh interface portproxy 转发不生效_SecureCRT远程端口转发不生效的解决方法
  7. TIMING_02 浅谈时序约束与时序分析
  8. 频率响应函数与数字滤波实验_WKD3419振动测试与控制教学实验系统
  9. python内建函数是什么意思_Python3内建函数简介,Python3内建函数详解
  10. 计算机专业顶尖会议论文,校友胡一公获计算机系统领域顶级会议ASPLOS 2019最佳论文奖...