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

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

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

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

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

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

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

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

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

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

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

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

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

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

没有任何不利之处

为什么很少使用? 因为:

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

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

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

人们倾向于使用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,GetmoduleeHandle(NULL),NULL); ShowWindow(hWnd,SW_SHOW);