15

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

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

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

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

4

5 回答 5

12

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

你会惊讶于你可以用标准对话框做什么——windows音量控制是用大约四个不同的对话框实现的——它有一个框架对话框,它又托管一个托盘窗口,托盘窗口又包含音量控制对话框,每个应用程序卷一个。

于 2011-05-10T03:19:42.913 回答
10

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

如果您的任何控件需要以像素为单位具有固定大小,您将不会对对话框提供的定位感到满意,并且需要在事后检查并移动所有子窗口。

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

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

于 2011-05-18T14:17:45.317 回答
8

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

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

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

于 2011-05-12T05:39:18.990 回答
6

没有任何缺点

为什么很少使用?因为:

  • 人们通常使用DialogBox它,因为这对于更简单的情况更容易。

  • 对于更复杂的情况,人们使用诸如 MFC 或 ATL(或一些外部库,如 GTk 或 Qt)之类的东西,而不用担心原生 Win32 图形。

于 2011-05-15T22:49:50.433 回答
1

使用 Windows SDK 没有缺点,像 MFC 这样的内部库使用 Windows SDK。

人们倾向于在 Windows SDK 上使用 MFC 等库,因为库有现成的东西。但是 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);
于 2011-05-18T07:23:33.793 回答