模式对话框与非模式对话框的区别
-
模式对话框就是不处理它就没法处理父窗口
,
而
非模式对话框就是不用先处理此对话框也可
以处理父窗口
.
p>
例子
:
在桌面上右击我的电脑
,
选择属性
,
弹出系统属性
窗口
,
点击下面的技术支
持
,
弹出技术支持信息
,
现
在再对系统属性窗口进行操作就操作不了
,
这种叫做模式对话框
;
关
闭技术支持信息
< br>,
在系统属性里选择硬件
,
点击
设备管理器
,
弹出设备管理器窗口
,<
/p>
现在再对系
统属性窗口进行操作仍然可以操作
,
这种就叫做非模式对话框。
在
WIN32
中,模式对话框的创建一
般是使用
DialogBox
来进行创建的。而非模式对话框则
是利用
CreateWindow
来创
建的。在
MFC
或是
WTL
中,模式对话框一般是使用
DoModal
,
p>
而非模式对话框的创建则是使用
Create
。
一、使用中的区别
模式对话框创建后,
程序的其他窗口便不能进行操作,
必须将该窗口关闭后,
其他窗口才能
进行操作。
而非模式对话框则无需这样,
它不强制要求用户立即反应,
而是与其他窗口同时
接受用户操作。
二、消息响应的区别
在消息响应方面,
模式对话框和非模
式对话框之间又有着很大的区别。
模式对话框工作的时
候,
p>
它有内部的消息泵机制,
控件之间的交互不用我们人为的去控制,<
/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
p>
风格。
p>
非模态对话框对象是用
new
操作符在堆中
动态创建的,而不是以成员变量的形式嵌入到别
的对象中或以局部变量的形式构建在堆栈
上。
通常应在对话框的拥有者窗口类内声明一个指
向对话框类的
指针成员变量,通过该指针可访问对话框对象。
通过调用
Create
函数来启动对话框,而不是
DoModal
,这是模态对话框的关键所在。由于
Create
函数不会启动新的消息循环,
对话框
与应用程序共用同一个消息循环,
这样对话框就
不会垄断用户的
输入。
Create
在显示了对话框后就立即返回,而
DoModal
是在对话框被关
闭后才返回的。
众所周知,在
MFC
程序中,窗口对象的生存期应长于对应的窗
口,也就是
说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由于在<
/p>
Create
返回后,
不能确定对话框是
否已关闭,
这样也就无法确定对话框对象的生存期,
因此只好在
堆中构建
对话框对象,而不能以局部变量的形式来构建之。
因为是用
new
操作符构建非模态对话框对象,因此必须在对话框关闭后,用
delete
操作符
删除对话框对象。
必须有一个标志表明非模态对话框是否是打开的。
这样做的原因是用户有可能在打开一个模
态对话框的情况下,又一次选择打
开命令。程序根据
标志来决定是打开一个新的对话框,
还是仅仅把原来打开的对话框激活。
通常可以用拥有者窗口中的指向对
话框对象的指针作为
这种标志,当对话框关闭时,给该指
p>
针赋
NULL
值,以表明对话框对象已不存
在了。
注意:
在
C++
编程中,
判断一个位于堆
中的对象是否存在的常用方法是判断指向该对象的指
针是否为空。这种机制要求程序员将
指向该对象的指针初始化为
NULL
值,在创建对象时
将返回的地址赋给该指针,而在删除对象时将该指针置成
NULL
值。
-----------------
--------------------------------------------------
-------------
模态
与
非模态
的对比:
模态——
形式上:
< br>①一个模式对话框是一个有系统菜单、
标题栏、
边线等的
弹出式窗口。
在创建对话
框时指定
WS
_POPUP
,
WS_SYSMENU,
WS_CAPTION
和
DS_MODALFRAME
风格。即使没有指定
WS_VISIBLE
风格,模式对话框也会被显示。
②创建
对话框
窗口
时,将
发送
WM_INITDI
ALOG
消
息(
如果指
定对
话框的
DS_SETFONT
风格,
还有
WM_SETFONT
消息)
给对话框过程。
(
对话框的窗口
过程由
Windows
系统提供,用户
在创建对话框窗口时提供一个对话框过程由窗
口过程调用。
)
③对话框窗口被创建之后,
Wind
ows
使得它成为一个激活的窗口,
它保持激活直到
对话框过程调用
::EndDialog
函数结束
对话框的运行或者
Windows
激活另一个应
用程序为止,在激活时,用户或者应用程序不可以激活它的所属窗口(
Owne
r
window
)
。
创建:
DoModal()
销毁
:
一
个应用程序通过调用
::EndDialog
函数来销毁一个模
式对话框。
一般情况下,
当用户
从系统
菜单里选择了关闭(
Close
)命令或者按下了确认(
OK
)或取消(
CANCLE
)
按钮,
::EndDialog
被对话框过程所调用。调用
::EndDialog
时,指
定其参数
nResult
的值,
Win
dows
将在销毁对话框窗口后返回这个值,
一般,
程序通过返回值判断对话
框窗口是否完成了任务或者被用户取消。
※
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
。
本
文
来
自
p>
CSDN
博
客
,<
/p>
转
载
请
标
明
出
处
:
/gfsuper_2211/archive/2009/05/30/