对话框


模态对话框

当显示一个模态对话框时,用户不能在对话框与同一程序中的另一窗口之间切换,用户必须显式的结束对话框。有些对话框甚至连其他程序也不让切换,这样的对话框称为“系统模态”。

对话框及其模板

当在资源编辑器中添加控件时,它自动将操作转换到rescource.h。在这个资源文件中记录了对话框的字体大小属性,和控件的一些属性等等。

资源模板使用的单位不是屏幕的绝对像素,而是一种只用于对话框模板特殊的坐标系。X坐标以及宽度是字符平均宽度1/4y坐标,以及高度是字符高度的1/8表示。

对话框过程

程序内的对话框过程处理传给对话框的消息。尽管看起来像是窗口过程,它不是真实的窗口过程。对话框窗口过程在Windows内部实现,这个窗口过程提供了操作对话框的几乎全部的功能。

它和窗口过程是有区别的,窗口过程返回的是一个LRESULT;对话框返回BOOL
如果窗口过程不处理消息,那么它调用DefWindowProc,如果对话框过程处理消息那么它返回TRUE,如果它不处理,返回FALSE
对话框过程不需要处理WM_PAINTWM_DESTROY消息。对话框过程不接收WM_CREATE,而在特殊的WM_INITDIALOG消息期间执行初始化。

WM_INITDIALOG是一个只发送给对话框过程的消息,如果对话框返回TRUE,那么Windows将输入焦点设置给第一个具有WS_TABSTOP风格的子窗口控制。也可以通过SetFocus将输入焦点设置为对话框子窗口,然后返回FALSE

此外,对话框过程只处理WM_COMMAND消息。这是当下压按钮被鼠标点中,或在按钮具有输入焦点情况下按下Spacebar键时,下压按钮发送给父窗口的消息。

激活对话框

通过函数DialogBox来建立一个模式对话框,该函数需要实例句柄、对话框名称、对话框的父窗口句柄,以及一个对话框过程的地址。直到对话框结束后,用来显示对话框的DialogBox才将控制返回给WndProc。即使在显示对话框时,WndProc也可以继续接收消息。事实上,可以从对话框过程内部给WndProc发送消息。

DialongBoxParam函数也建立对话框,它比DialogBox在最后多一个参数,它最后的参数作为WM_INITDIALOG消息中的lParam传递给对话框过程。

对话框主题

如果使用了WS_CAPTION,可以将标题放入对话框的标题栏,在INITDIALOG时可以使用SetWindowText来设置对话框标题栏上的标题。甚至还可以给对话框加入菜单。

尽管对话框窗口过程通常位于Windows内部,但也可以使用自己编写的窗口过程来处理对话框消息。这样做,必须在对话框模板里指定一个窗口类名。

当调用DialogBox时,Windows通过调用CreateWindow来完成创建弹出窗口所需完成的一切操作。Windows从对话框模板中获取窗口坐标、大小、窗口风格、标题和菜单。它所需要的唯一的其他消息是窗口类。当然也可以通过自己创建弹出窗口来维护和创建自己的对话框。不过,使用DialogBox更简单。

也可以通过DialogBoxIndirect函数来创建对话框而不使用资源中定义对话框模板。

使用对话框控制

大多数子窗口给父窗口发送WM_COMMAND消息,子窗口也可以给父窗口发送控制消息。不过Windows也提供也一些简单的方法。

可以通过GetDlgItem来得到一个对话框控制的窗口句柄,也可以用GetWindowLong来获取控制的ID值。

通过SendDlgItemMessage可以方便的给子窗口发送消息。
对于RadioButton控件CheckRadioButton可以将ID在范围内的控件选中,唯一限制就是RadioButtonID必须连续。
CheckDlgButton
可以设置和清除复选标记。
IsDlgButtonChecked
可以获取复选框状态。

OKCancel按钮

对话框模板中,OKID值为IDOKCancel按钮IDIDCANCEL。在对话框中通常安排OKCancel按钮,将OK作为默认按钮有助于键盘中止对话。

使用EndDialog来结束对话框,第二个参数为返回的值。

非模态对话框

非模态对话框允许用户在对话框与创建对话框的窗口进行切换。非模态对话框是使用CreateDialog来创建的,它立即返回对话框窗口句柄

非模态对话框与模态对话框区别:
非模态对话框通常包含标题栏和系统菜单框。
如果定义时省略了WS_VISIBLE,那么必须在CreateDialog后调用ShowWindow
与模态对话框的消息框不同,非模态对话框消息经过消息队列。

通用对话框

对与许多常用的菜单项,Windows中有一个“通用对话框库”的解决方案。这个库由几个函数组成,这些函数激活标准对话框来进行打开和保存文件、查找和替换、选择颜色、选择字体以及打印。

这些函数基本上都需要初始化某一结构的字段,并将该结构的指针传送给通用对话框库的某个函数,该函数创建并显示对话框。当用户关闭对话框时,被调用的函数将控制返回给程序,您可以从传送给他的结构中获取信息。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页