Win32:CreateDialog而不是对CreateWindow的多次调用 - 任何缺点?

时间:2011-05-10 02:38:03

标签: windows winapi createwindow

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

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

通过在对话框模板中使用CLASS语句,我应该能够使主窗口使用自定义窗口类(因此自定义窗口过程),从而避免窗口具有任何类似对话框的行为。 Charles Petzold的“编程Windows”中可以找到这种技术的一个例子:the HEXCALC program in chapter 11

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

5 个答案:

答案 0 :(得分:11)

您无法控制主窗口消息循环 - 对话管理器会为您处理它。另一方面,对话管理器处理键盘加速器,标签排序和许多其他效果。

你会惊讶于你可以用标准对话框做什么 - 窗口音量控制是用大约四个不同的对话框实现的 - 它有一个框架对话框,它反过来主持一个托盘窗口,而托盘窗口依次保持卷控制对话框,每个应用程序卷一个。

答案 1 :(得分:8)

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

如果你的任何控件需要有像素的固定尺寸,你将不满意对话框提供的定位,并且需要经过并在事后移动所有子窗口。

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

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

答案 2 :(得分:7)

能够完全控制您的窗口,即使它是使用CreateDialog创建的。

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

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

答案 3 :(得分:5)

没有任何缺点

为什么很少使用?这是因为:

  • 人们通常会使用DialogBox,因为对于更简单的案例来说,这更容易。

  • 对于更复杂的情况,人们会使用MFC或ATL(或某些外部库,如GTk或Qt),并且不需要使用原生Win32图形。

答案 4 :(得分:0)

使用Windows SDK没有任何缺点,MFC等内部库使用Windows SDK。

人们倾向于使用像MFC这样的库而不是Windows SDK,因为图书馆有现成的东西。但是,Windows SDK调用比库调用更快,因此在某些情况下,开发人员直接调用Windows SDK。

CButton btnOk ;
btnOK.Create(_T("Press Me"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(100,100,300,300), pParentWnd, 1);

类似于以下代码,

HWND hWnd = CreateWindow("BUTTON","Press Me",WS_CHILD|WS_POPUP|BS_DEFPUSHBUTTON,100,100,300,300,NULL,NULL,GetModuleHandle(NULL),NULL);
ShowWindow(hWnd,SW_SHOW);