模式对话框

模式对话框

模式(modal)对话框,即模态对话框,是指用户在Windows应用程式的对话框中,想要对对话框以外的应用程式进行操作时,必须首先对该对话框进行回响。如单击【确定】或【取消】按钮等将该对话框关闭。相对应的另一个对话框是无模式对话框。

  • 中文名称
    模式对话框
  • 外文名称
  • 别名
    模态对话框
  • 解释
    对话框的一种

简介

对话框可以分为模式对话框和非模式对话框两种。模式对话框是指使用者只能在当前的窗体中进行操作,在该窗体没有关闭之前不能切换到其他的窗体。非模式对话框是指当前的所操作的窗体可以切换。

一般情况下,用于确认信息的操作和一般的操作的对话框属于模式对话框。如开启档案对话框就是典型的模式对话框,而常见的查找和替换便是非模式对话框。

区别

在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值。

相关词条

相关搜索

其它词条