系统内置对话框
MessageBox(Ex|Indirect):最简单的消息框,功能有限,但有时候非常方便。
TaskDialog(Indirect):用于Windows Vista+,需要声明comctl32 v6.0,可用于创建Vista风格的消息框。
通用对话框(Common Dialogs):ChooseColor、ChooseFont、GetOpenFileName、GetSaveFileName、PageSetupDlg、PrintDlg、PrintDlgEx、FindText、ReplaceText等。
Shell对话框:ShellAbout、SHBrowseForFolder、RestartDialog(Ex)等。
Toolbar的“自定义工具栏”对话框。
自定义模板对话框
DialogBox(Param):用于按照rc资源中的对话框模板创建模态对话框,这种对话框使用对话框回调而不是窗口回调,并且会阻塞程序运行和父窗口获得焦点,因此也称独占式对话框。
- 除少数消息外,返回值都是(INT_PTR)(BOOL)类型,返回TRUE表示已处理,返回FALSE表示未处理,窗口消息对应的返回值用SetWindowLongPtr(hDlg, DWLP_MSGRESULT, result);设置
- 创建对话框时收到WM_INITDIALOG而不是WM_CREATE消息
- 按Enter键收到IDOK的WM_COMMAND消息,按Esc或关闭按钮收到IDCANCEL的WM_COMMAND消息
- 结束对话框使用EndDialog函数而不是DestroyWindow函数
- 用Tab键可切换焦点,会测试子窗口的WM_GETDLGCODE消息
CreateDialog(Param):用于按照rc资源中的对话框模板创建非模态对话框,这种对话框拥有与DialogBox一样的对话框回调,但是不会阻塞程序运行。
- 需要编写消息循环,消息循环里使用IsDialogMessage处理控件焦点相关的键盘消息
- 终止程序+销毁对话框要使用PostQuitMessage+DestroyWindow
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0))
{
if (IsDialogMessage(hDlg, &msg))
continue;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
PropertySheet:用于创建带选项卡的对话框,也可用于创建向导界面。控制面板上很多对话框也是使用PropertySheet函数弹出的,并不是直接使用DialogBox,比如“日期与时间”对话框与“添加硬件”向导。