转自:http://hi.baidu.com/moqingzhimeixin/blog/item/8361608b886f53dbfc1f1072.html
对话框是一种提供用户与应用程序交互的弹出式窗口。当用户单击菜单的某个菜单项(通常标题以“…”结尾)或者按钮时,会弹出一个对话框窗口,用户可以从中读取信息、写入文本内容、设置某些选项等。
对话框分为模态和非模态对话框两种。模态对话框最为常用,它不允许用户在关闭对话框之前切换到该应用程序的其他窗口;相反,非模态对话框则允许这样做。这是两种对话框最明显的区别。
一、 模态对话框
模态对话框是使用最广泛的对话框类型,其特点是:当用户激活一个程序的模态对话框后,不能来回切换到该程序的其他窗口中,而必须显示结束该对话框(通常是单击“OK”按钮)。这种特性在一些应用程序的执行流程控制中经常遇到。
1. 设计对话框
对话框也属于一种资源,为应用程序添加对话框时,首先在Visual C++ Developer Studio 中选择“**”/“资源…”,然后选择对话框即可创建一个对话框模板。由于这个对话框模板基于Developer Studio提供的预定义对话框模板,所以剩下的工作就是修改对话框的尺寸、标识符、标题、字体等,以及在对话框中添加控件(Controls)等。
对话框功能的实现离不开控件(有些书中也称为控制),特别是系统提供的通用控件给对话框赋予了强大的功能。例如,对话框中的编辑框控件(Edit Controls)允许用户在其中写入文本,静态文本控件(Static Controls)可以为用户提供相关信息。在Visual C++ Developer Studio界面的工具栏上单击鼠标右键,选择“Controls”菜单项,弹出的工具栏中包含了程序最常用的控件,如表5-3所示。添加某个控件十分容易,只需拖动工具栏上的控件到对话框模板上即可(当然,控件也有许多属性需要调整)。
表5-3 对话框中常用的控件及说明
控件标识符 说 明 控件标识符 说 明
CHECKBOX 复选框控件 LISTBOX 列表框控件
COMBOBOX 组合框控件 LTEXT 文本左对齐的静态控件
CTEXT 文本居中的静态控件 PUBSHBUTTON 按钮控件
DEFPUSHBUTTON 默认按钮控件 RADIOBUTTON 单选按钮控件
EDITTEXT 编辑框控件 RTEXT 文本右对齐的静态控件
GROUPBOX 组控件 SCROLLBAR 滚动条控件
ICON 图标,属静态控件
2. 对话框资源
设计好的对话框模板被添加到资源中。在资源脚本文件中,对话框的描述如下:
////////////////////////////////////////////////////
// Dialog
IDD_ABOUTDLG DIALOGEX 30, 30, 210, 125
STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "关于程序..."
FONT 12, "华文隶书"
BEGIN
DEFPUSHBUTTON "&OK", IDOK, 53,103,50,14
PUSHBUTTON "&Cancel", IDCANCEL, 115,103,50,14
PUSHBUTTON "作者...", IDC_MYBUTTON, 128,48,37,11, BS_FLAT,
WS_EX_DLGMODALFRAME
EDITTEXT IDC_MYEDIT, 53,72,112,13, ES_AUTOHSCROLL |
ES_WANTRETURN
CTEXT "*** 关于程序 ***", IDC_STATIC, 62,16,86,14,
SS_CENTERIMAGE
CTEXT "ModeDlg 程序演示了模态对话框的创建和使用。",
IDC_STATIC, 26,38,166,10
LTEXT "有任何问题请与作者联系:", IDC_STATIC, 26,49,96,8
LTEXT "您的意见:", IDC_STATIC, 26,59,45,11
END
以上代码是下一小节模态对话框程序实例ModeDlg的资源脚本文件的一部分。在资源脚本文件中,对话框的定义分成如下几个部分:
● 对话框模板名称或者标识符:IDD_ABOUTDLG为对话框标识符。
● DIALOGEX关键字。
● 对话框的位置及外型尺寸:30, 30, 210, 125,分别为对话框显示时,其左上角在程序窗口中的位置(30, 30)和对话框的尺寸(210, 125)。
● 样式属性选项:设计对话框时使用的属性对话框,包含了这些样式的设定,如WS_POPUP,WS_CAPTION等。
● 对话框标题:“关于程序...”。
● 字体属性:对话框中所有文本使用的字体为“华文隶书”,其大小为12磅。
● 控件属性设置:关键字BEGIN和END之间是对话框包含的控件。每个控件前三个字段分别是控件类型标识符、控件相关的文本和控件标识符。
3. 对话框过程
在资源脚本文件中定义对话框资源后,调用函数DialogBox可以在窗口中创建并显示模态对话框,这是显示对话框最简便的方法。
(1)DialogBox
● 说明
从对话框模板资源中创建模态对话框。
● 原型
INT_PTR DialogBox ( HINSTANCE hInstance, LPCTSTR lpTemplate,
HWND hWndParent, DLGPROC DialogFunc );
● 参数
lpTemplate:资源中对话框模板的标识符。
hWndParant:拥有对话框的窗口的句柄,通常是对话框的父窗口
lpDialogFunc:指定对话框过程的地址。
● 返回值
如果函数调用成功,则返回介绍对话框的函数EndDialog的nResult参数;否则,返回值为零。
(2)EndDialog
● 说明
通知系统清除对话框,并将控制交给程序的窗口过程。
● 原型
BOOL EndDialog (HWND hDlg, INT_PTR nResult );
● 参数
hDlg:对话框的句柄。
nResult:函数DialogBox返回时的返回值。
● 返回值
如果函数调用成功则返回非零,否则返回零。
(3)DialogProc
● 说明
当模态对话框被创建后,程序将发生在对话框中的事件消息传送到对话框过程中进行处理,而不是交给程序的窗口过程。
● 原型
BOOL CALLBACK DialogProc (HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam );
● 参数
uMsg:消息的标识符。
wParam和lParam:消息的两个32位参数。
对话框过程与程序的窗口过程的参数类似,但两者也存在以下的不同点:
● 窗口过程返回LRESULT值,对话框过程返回BOOL型值。所有对话框过程中的进行处理的消息返回TRUE,不进行处理的消息返回FALSE,并不交给默认的处理函数(如DefWindowProc)处理。
● 对话框过程不需要处理WM_PAINT,WM_DESTROY和WM_CREATE消息。
● 对话框过程在消息WM_INITDIALOG期间,执行对话框的初始化工作,这相当于对窗口过程的WM_CREATE消息的处理。
对于对话框过程来说,最重要的消息是WM_COMMAND消息。当对话框中的下压按钮或者其他控件被单击时,对话框过程接收这个消息。消息的wParam参数的低字位包含了该消息控件的标识符,高字位是一个消息通知码;消息lParam参数值则是控件的窗口句柄。