windows - createwindow函数 - Win32:CreateDialog而不是多次调用CreateWindow-任何缺点?




registerclass (4)

你不能控制你的主窗口消息循环 - 对话管理器为你处理它。 另一方面,对话管理器处理键盘快捷键,标签排序和一些其他的效果。

你会惊讶你可以用一个标准的对话框做什么 - 窗口音量控制是由约四个不同的对话框实现的 - 它有一个框架对话框,这个框架对话框又托管一个托盘窗口,托盘窗口依次保存音量控制对话框,每个应用程序量一个。

我目前正在一个Win32程序,它需要一个主窗口包含许多子窗口控件 - 按钮,列表视图等。 我相信建立这样一个窗口的标准方法是首先为主窗口调用CreateWindow,然后再为每个控件调用CreateWindow。

作为一个更简单的选择,我正在考虑使用资源编辑器的对话框设计器来设计主窗口,然后使用CreateDialog一次构建主窗口。

通过在对话框模板中使用CLASS语句,我应该能够获得主窗口使用自定义窗口类(从而自定义窗口过程),从而避免窗口有类似对话的行为。 在Charles Petzold的“Programming Windows”中可以找到这种技术的一个例子: 第11章中的HEXCALC程序

以这种方式创建我的主窗口有什么缺点吗? 如果是这样,他们是什么? 如果没有,为什么这种方法很少使用?


没有任何不利之处

为什么很少使用? 因为:

  • 人们通常使用DialogBox来代替,因为对于更简单的情况来说更容易。

  • 对于更复杂的情况,人们使用诸如MFC或ATL(或GTK或Qt等外部库)的东西,而不用打扰本机Win32图形。


我所知道的CreateDialog唯一的缺点是(比起重复的CreateWindow,不是说一些重量级的框架,只是Win32 vs Win32),就是对话资源使用对话框单元来定位子窗口。 所以布局不仅取决于DPI,还取决于用户的主题设置(字体的选择和大小)。

如果你的任何一个控件都需要固定的像素大小,你将不会满意对话提供的定位,并且需要在事实之后通过并移动所有的子窗口。

所以是的,你可以使用CreateDialog作为一个快捷方式来创建一堆具有指定的类和样式的窗口。 但不,你不能在对话框编辑器中做你的布局。

OTOH,您可以存储设计机器上使用的DLU < - >像素转换,然后充分了解解析DIALOG资源内部格式以提取定位信息,然后转换为像素,并以更自动的方式修正定位。


即使是使用CreateDialog创建的,您可以完全控制窗口。

通常,当你创建自己的窗口(你的类)时,使用的窗口过程就是你在类中注册的窗口。 通过CreateDialog创建的OTOH窗口将具有对话框标准窗口过程( DefDlgProc ),它将主要调用您提供的“对话框处理程序”。

如果你想完全控制所有的消息,你可以在创建后立即替换新创建的窗口的窗口过程。 只需使用GWLP_WNDPROC参数调用SetWindowLongPtr GWLP_WNDPROC 。 不过,您可以通过在您的过程中调用IsDialogMessage自动处理某些特定于对话的内容。