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

温柔似野鬼°
936次浏览
2021年02月11日 16:23
最佳经验
本文由作者推荐

-

2021年2月11日发(作者:算盘是什么时候发明的)


模式对话框就是不处理它就没法处理父窗口


,


而 非模式对话框就是不用先处理此对话框也可


以处理父窗口


.


例子


:


在桌面上右击我的电脑


,


选择属性


,


弹出系统属性 窗口


,


点击下面的技术支


持

< p>
,


弹出技术支持信息


,


现 在再对系统属性窗口进行操作就操作不了


,


这种叫做模式对话框


;


关


闭技术支持信息

< br>,


在系统属性里选择硬件


,


点击 设备管理器


,


弹出设备管理器窗口


,< /p>


现在再对系


统属性窗口进行操作仍然可以操作

,


这种就叫做非模式对话框。




在


WIN32


中,模式对话框的创建一 般是使用


DialogBox


来进行创建的。而非模式对话框则


是利用


CreateWindow


来创 建的。在


MFC


或是


WTL

< p>
中,模式对话框一般是使用


DoModal


,


而非模式对话框的创建则是使用


Create


。




一、使用中的区别




模式对话框创建后,


程序的其他窗口便不能进行操作,


必须将该窗口关闭后,


其他窗口才能


进行操作。


而非模式对话框则无需这样,


它不强制要求用户立即反应,

而是与其他窗口同时


接受用户操作。




二、消息响应的区别




在消息响应方面,


模式对话框和非模 式对话框之间又有着很大的区别。


模式对话框工作的时


候,


它有内部的消息泵机制,


控件之间的交互不用我们人为的去控制,< /p>


系统会帮助我们去处


理。非模式对话框则像普通窗口一样,则由< /p>


WinMain


中书写的消息循环驱动。但由于是对


话框,


它对一些消息有特殊的处理。


因此,


在消息循环中,


需要先对对话框提供截获消息的


机会。




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


{


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


{






TranslateMessage(&msg);







DispatchMessage( &msg);


}


}



如果当前取得的消息是对话框的 消息,


IsDialogMessage


将它交由对话消息处 理函数处理,


并返回


TRUE


。不需要 再派发了。




注意:


这个方法并不是很好用,


因为当对话框过多的时候,


处 理起来就比较麻烦了。


另一种


处理的方法是利用子类化控件的方 法,来处理控件间的交互。




三、销毁的区别



模式对话框的销毁是 使用


EndDialog


,而非模式对话框的销毁是使用


DestroyWindow.


。所以


我们在 销毁对话框的时候,也要对其进行区别。



< br>非模式对话框,


用户关闭对话框时,


对话框消息处理函数 将收到


WM_CLOSE


消息,


接到后


调用


DestroyWindow


以销 毁非模式对话框。




模式对话框,则 一般响应


IDOK


和


IDCANCEL


。在


PPC


上,我们对于


OK


键和


X


键的处理


要注意这点。




四、其他




非模态对话框的模板必须具有


Visible


风格,否则对话框 将不可见,而模态对话框则无需设


置该项风格。更保险的办法是调用

ShowWindow(hDialog,


SW_SHOW)

来显示对话框,而不


管对话框是否具有


Visible


风格。





非模态对话框对象是用


new


操作符在堆中 动态创建的,而不是以成员变量的形式嵌入到别


的对象中或以局部变量的形式构建在堆栈 上。


通常应在对话框的拥有者窗口类内声明一个指


向对话框类的 指针成员变量,通过该指针可访问对话框对象。



< p>
通过调用


Create


函数来启动对话框,而不是


DoModal


,这是模态对话框的关键所在。由于

< p>
Create


函数不会启动新的消息循环,


对话框 与应用程序共用同一个消息循环,


这样对话框就


不会垄断用户的 输入。


Create


在显示了对话框后就立即返回,而


DoModal


是在对话框被关


闭后才返回的。 众所周知,在


MFC


程序中,窗口对象的生存期应长于对应的窗 口,也就是


说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由于在< /p>


Create


返回后,


不能确定对话框是 否已关闭,


这样也就无法确定对话框对象的生存期,


因此只好在 堆中构建


对话框对象,而不能以局部变量的形式来构建之。




因为是用


new

操作符构建非模态对话框对象,因此必须在对话框关闭后,用


delete


操作符


删除对话框对象。




必须有一个标志表明非模态对话框是否是打开的。

< p>
这样做的原因是用户有可能在打开一个模


态对话框的情况下,又一次选择打 开命令。程序根据



标志来决定是打开一个新的对话框,


还是仅仅把原来打开的对话框激活。


通常可以用拥有者窗口中的指向对 话框对象的指针作为


这种标志,当对话框关闭时,给该指



针赋


NULL


值,以表明对话框对象已不存 在了。




注意:

在


C++


编程中,


判断一个位于堆 中的对象是否存在的常用方法是判断指向该对象的指


针是否为空。这种机制要求程序员将 指向该对象的指针初始化为


NULL


值,在创建对象时


将返回的地址赋给该指针,而在删除对象时将该指针置成


NULL


值。



----------------- -------------------------------------------------- -------------




模态



与



非模态



的对比:



模态——



形式上:

< br>①一个模式对话框是一个有系统菜单、


标题栏、


边线等的 弹出式窗口。


在创建对话


框时指定


WS _POPUP


,


WS_SYSMENU,


WS_CAPTION


和


< p>
DS_MODALFRAME


风格。即使没有指定


WS_VISIBLE


风格,模式对话框也会被显示。




②创建


对话框


窗口


时,将


发送


WM_INITDI ALOG


消


息(


如果指


定对


话框的


DS_SETFONT

风格,


还有


WM_SETFONT


消息)


给对话框过程。


(


对话框的窗口


过程由


Windows


系统提供,用户 在创建对话框窗口时提供一个对话框过程由窗


口过程调用。


)



③对话框窗口被创建之后,


Wind ows


使得它成为一个激活的窗口,


它保持激活直到

< p>
对话框过程调用


::EndDialog


函数结束 对话框的运行或者


Windows


激活另一个应


用程序为止,在激活时,用户或者应用程序不可以激活它的所属窗口(


Owne r


window


)


。




创建:


DoModal()




销毁


:


一 个应用程序通过调用


::EndDialog


函数来销毁一个模 式对话框。


一般情况下,


当用户


从系统 菜单里选择了关闭(


Close


)命令或者按下了确认(


OK


)或取消(


CANCLE


)


按钮,


::EndDialog

被对话框过程所调用。调用


::EndDialog


时,指 定其参数


nResult


的值,


Win dows


将在销毁对话框窗口后返回这个值,


一般,

< p>
程序通过返回值判断对话


框窗口是否完成了任务或者被用户取消。




※



EndDialog(IDC_BUTTON_DEFAULT);


我


们


的


代


码中


EndDialog


方


法


在


指


定


的


B UTTON


处理事件结束时调用


,


来关 闭对话框




非模态——



形式上:


①一个无模式对话框是一个有系统菜单、


标题栏、


边线 等的弹出式窗口。


在创建对


话框模板时指定

WS_POPUP


、


WS_CAPTION


、


WS_BORDER


和


WS _SYSMENU


风格。如果没有指定


WS_VISIBLE< /p>


风格,无模式对话框不会自动地显示出来。




②一个无模式对话框既不会禁止所属窗口,

< br>也不会给它发送消息。


当创建一个模式


对话框时,


Windows


使它成为活动窗口,


但用户或 者程序可以随时改变和设置活


动窗口。如果对话框失去激活,那么即使所属窗口是活动的 ,在


Z


轴顺序上,


它仍然在所属窗口之 上。



创建:


Create()




销毁


:


在应用程序结束之前,它必须销毁所有的无模式对话框。使用


: :DestroyWindow


销毁


一个无模式对话框,不是使 用


::EndDiaLog


。一般来说,对话框过程响应用户输 入,


如用户选择了“取消”按钮,则自动调用


::Destro yWindow


;如果用户没有有关动作,


则应用程序必须调用


::DestroyWindow


。




本









文


来


自


CSDN


博


客


,< /p>


转


载


请


标


明


出


处


:

< p>
/gfsuper_2211/archive/2009/05/30/


-


-


-


-


-


-


-


-