正确的做法是什么,DialogBox还是CreateWindow

What is the right thing to do, DialogBox or CreateWindow

本文关键字:DialogBox 还是 CreateWindow 是什么      更新时间:2023-10-16

尊敬的经验丰富的用户,

我在windows中编程已经有一段时间了,我一直有这个问题What is the right thing to do when creating a user interface?

是对资源脚本中的UI执行操作并调用DialogBox吗。

或者,首先创建一个WNDCLASS结构的更乏味的方法是声明字段RegisterClass(&wc)并使用CreateWindow,最后它的相同功能只是使用DialogBox初始化更容易,并且可以放松对类的控制。

我想你会问这个应用程序的用途是什么,当然我可以说它是用于蒙皮应用程序(然后我会使用CreateWindow),如果它是用于简单的计算器应用程序,我会选择Dialogbox。

但是职业选手的目标是什么?

请注意win32区域,因为我不会争论是否对这类应用程序使用QT或Java,我的立场是框架会增加很多不必要的开销,Java JRE和QT是额外的DLL和.NET,所有这些都会增加用户安装这些文件的要求,如果不安装,则需要下载所有这些文件。这些文件位于>20 mb的区域。我看不出这有什么道理。

感谢您的回答和花时间阅读我的漫谈

根据我的经验,使用DialogBox作为主窗口应用程序一开始似乎很容易,但后来会变得非常不舒服,特别是如果您使用DialogBox()(而不是CreateDialog():

  1. 您无法控制消息循环。迟早你会想要添加一个预翻译消息步骤,或者一个空闲处理,或者类似的东西。为此,您需要编写自己的消息循环。

  2. 您编写的不是消息过程,而是对话框过程。还有很多不同之处,我能想到的最重要的是:

    a。返回值不是消息中记录的真正的LRESULT,而是一个BOOL,除了极少数仅用于对话的消息外,它在所有消息中都是无用的。

    b。一些重要消息不会发送到对话框过程,特别是WM_CREATE。

  3. 您没有定义窗口的WNDCLASS,因此有一些事情您无法更改:默认的HBRUSH、默认的HICON、WNDCLASS标志等。使用FindWindow将成为PITA。

  4. 你不能在对话框中添加菜单,工具栏看起来很奇怪。

诚然,所有这些缺点都有解决办法,但这不是重点。

关于明显的优势:

  1. "您可以使用对话框编辑器轻松地布局控件":实际上,应用程序主窗口不应该有那么多用户控件。想想你最喜欢的Windows应用程序,它在主窗口中有多少控件?只需将控件留给选项对话框或其他什么即可。

  2. "焦点由底层对话框自动处理":如果主窗口中没有控件,这一点就没有意义了。此外,如果你真的必须这样做的话,处理焦点是微不足道的

我并不是说制作一个基于对话框的应用程序毫无意义;只是如果有更好的方法,你应该三思而后行,尤其是对于非琐碎的方法。

您可以将DialogBox视为由几个逻辑部分组成的复合体:

  1. 正在加载对话框定义资源
  2. 创建对话框窗口是通过对CreateWindow的多次调用在内部完成的:第一次调用对话框本身,然后调用模板中的控件
  3. 阻塞所有者窗口以支持"模态"并运行消息泵:GetMessage->IsDialogMessage或TranslateMessage+DispatchMessage

打个比方说,当程序流必须根据用户的决定进行分支时,这种组合非常有用,可以将该决定封装到对DialogBox()函数的单个调用中。这个函数确实做了很多工作,通过隐藏与原始Win32窗口交互的异步性质,简化了对程序的理解。

然而,如果Win32已经有消息循环,并且对DialogBox的调用是对特定消息的响应,那么这种"高度水平",特别是其中包含的消息循环,实际上可能会增加程序的复杂性。因此,在这种情况下,您必须注意嵌套的消息循环,尤其是当您在主消息循环中进行自定义消息处理时。

为了避免此类问题,可以使用CreateDialog函数,它也是一个复杂的函数,但仅包含第1部分和第2部分——它不会启动消息循环。因此,您必须提供自己的消息处理过程。如果需要的话,你也应该注意模态。

在我的实践中,对于非常小的实用程序应用程序,我只使用过几次DialogBox。

使用对话框作为应用程序的主窗口非常方便,以至于Visual Studio在创建新项目时将其作为一种选择。您可以使用资源编辑器布置窗口,创建对话框时将自动创建所有子窗口。

您甚至可以通过响应对话框的WM_PAINT消息来创建自己的自定义背景。

对话框的默认行为也很有用,例如通过响应TAB键来更改控制焦点。