use*_*783 14 windows winapi createwindow
我目前正在开发一个Win32程序,它需要一个包含许多子窗口控件的主窗口 - 按钮,列表视图等.我认为构建这样一个窗口的标准方法是首先为主窗口调用CreateWindow,然后再为每个控件调用.
作为一个更简单的选项,我正在考虑使用资源编辑器的对话框设计器设计主窗口,然后使用CreateDialog一次构建主窗口.
通过在对话框模板中使用CLASS语句,我应该能够使主窗口使用自定义窗口类(因此自定义窗口过程),从而避免窗口具有任何类似对话框的行为.这种技术的一个例子可以在Charles Petzold的"Programming Windows"中找到:第11章中的HEXCALC程序.
以这种方式创建主窗口有什么缺点吗?如果是这样,他们是什么?如果没有,为什么这种方法很少使用?
Rei*_*man 11
您无法控制主窗口消息循环 - 对话管理器会为您处理它.另一方面,对话管理器处理键盘加速器,标签排序和许多其他效果.
你会惊讶于你可以用标准对话框做什么 - 窗口音量控制是用大约四个不同的对话框实现的 - 它有一个框架对话框,它反过来主持托盘窗口,托盘窗口又保持音量控制对话框,每个应用程序卷一个.
我知道的CreateDialog的唯一缺点(与重复的CreateWindow相比,不是在谈论一些重量级框架,只是Win32 vs Win32)是对话框资源使用对话框单元定位子窗口.因此布局不仅取决于DPI,还取决于用户的主题设置(字体的选择和大小).
如果您的任何控件需要具有固定大小的像素,您将不满意对话框提供的定位,并且需要经过并在事后移动所有子窗口.
所以,是的,您可以使用CreateDialog快捷方式创建一堆具有指定类和样式的窗口.但不,你不能在对话框编辑器中进行布局.
OTOH,您可以存储设计机器上使用的DLU < - >像素转换,然后学习解析DIALOG资源内部格式以提取定位信息,然后转换为像素并以更自动化的方式更正定位.
即使创建了窗口,您也可以完全控制窗口CreateDialog.
通常,当您创建自己的窗口(您的类)时,使用的窗口过程是您在类中注册的窗口过程.创建的OTOH窗口CreateDialog将具有对话框标准窗口过程(DefDlgProc),它将主要调用您提供的"对话框处理程序".
如果要完全控制所有消息,可以在创建后立即替换新创建窗口的窗口过程.只需SetWindowLongPtr用GWLP_WNDPROC参数调用即可.不过,您可以通过IsDialogMessage在程序中调用来自动处理某些特定于对话框的事物.
有没有缺点任何责任.
为什么很少使用?因为:
人们通常会使用DialogBox,因为对于更简单的情况,这更容易.
对于更复杂的情况,人们使用诸如MFC或ATL(或某些外部库,如GTk或Qt)之类的东西,并且不需要使用本机Win32图形.