第十一章 对话框part3

来源:互联网 发布:沈航网络自助服务平台 编辑:程序博客网 时间:2024/06/04 18:59

11.2非模态对话框

非模态对话框允许使用者在对话框与其它程序之间进行切换,又可以在对话框与建立对话框的窗口之间进行切换。当使用者觉得让对话框保留片刻会更加方便时,使用非模态对话框是合适的。

非模态对话框是使用CreateDialog来建立的,该函数所使用的参数与DialogBox相同。hDlgModeless = CreateDialog ( hInstance, szTemplate, hwndParent, DialogProc); 区别是CreateDialog函数立即传回对话框的窗口句柄,并通常将这个窗口句柄存放到整体变量中。

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

①非模态对话框通常包含一个标题列和一个系统菜单按钮。对于模态对话框,您通常无须提供标题列和系统菜单。

②用于非模态对话框的对话框模板中的STYLE叙述形如:  STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE  如果省略了WS_VISIBLE,那么您必须在CreateDialog呼叫之后呼叫ShowWindow

hDlgModeless = CreateDialog (    . . .    ) ;        ShowWindow (hDlgModeless, SW_SHOW) ;  果您既没有包含WS_VISIBLE样式,又没有呼叫ShowWindow,那么非模态对话框将不会被显示。

③与模态对话框和消息框的消息不同,非模态对话框的消息要经过程序式的消息队列。要将这些消息传送给对话框窗口消息处理程序,则必须改变消息队列。具体的代码如下:

如果消息是发送给非模态对话框的,那么IsDialogMessage将它发送给对话框中窗口消息处理程序,并传回TRUE(非0);否则,它将传回FALSE(0)。简单来说就是如果消息是发给非模态对话框的话,该消息就不进入windows的消息循环。

④使用DestroyWindow而不是EndDialog来结束非模态对话框。

也可以用CreateDialogParam来建立非模态对话框,并让它储存一个结构指针。

模态对话框和非模态对话框的消息循环

1、非模态对话框和父窗口共享当前线程的消息循环

2、模态对话框新建一个新的消息循环,并由当前消息循环派发消息,而父窗口。模态对话框屏蔽了用户对它父窗口的操作,但是不是在消息循环里面屏蔽,所以给父窗口发送消息,父窗口还是可以接收得到。

3、调用模态对话框的窗口处理函数会被阻塞,但是新的消息循环仍然可以调用父窗口的消息处理函数,所以,发送给父窗口的新消息仍然可以被及时处理。

新的COLORS程序

在COLORS2中,非模态对话框是在WinMain函数里建立的,紧跟在程序主窗口的ShowWindow呼叫之后。注意,主窗口的窗口样式包含WS_CLIPCHILDREN,这允许程序无须擦除对话框就能够重画主窗口。

COLORS2.rc

当建立对话框模板时,直接将三个滚动条的ID分别设为10、11和12,将显示滚动条目前值的三个静态文字字段的ID分别设为13、14和15。将每个滚动条都设定为Tab Stop样式,而从所有的六个静态文字字段中删除Group样式。 

HEXCALC:窗口还是对话框?

HEXCALC.rc

这个程序完全不呼叫CreateWindow,也不处理WM_PAINT消息,不取得设备内容,也不处理鼠标消息。

CLASS叙述是这个对话框与曾经建立过的对话框之间最重要的区别。

包含CLASS叙述就告诉Windows将消息发送到其它的地方-具体的说,就是发送到在HexCalc窗口类别中指定的窗口消息处理程序。

WNDCLASS结构的cbWndExtra字段设定为DLGWINDOWEXTRA。对于您自己注册的对话框程序,这是必需的。

原创粉丝点击