acmilan作者
9年8个月前修改于 9年8个月前IP:四川
833124
3楼

系统内置对话框

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,比如“日期与时间”对话框与“添加硬件”向导。

proertysheet1.png

wizard.png

评论
文号 / 833124

千古风流
名片发私信
学术分 4
总主题 466 帖总回复 2942 楼拥有证书:进士 学者 笔友
注册于 2009/05/30 21:22:42最后登录 2019/01/31 17:16:38
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:0

个人简介

暂未填写
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的