正确的做法是什么,DialogBox还是CreateWindow
What is the right thing to do, DialogBox or CreateWindow
尊敬的经验丰富的用户,
我在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()
:
-
您无法控制消息循环。迟早你会想要添加一个预翻译消息步骤,或者一个空闲处理,或者类似的东西。为此,您需要编写自己的消息循环。
-
您编写的不是消息过程,而是对话框过程。还有很多不同之处,我能想到的最重要的是:
a。返回值不是消息中记录的真正的
LRESULT
,而是一个BOOL
,除了极少数仅用于对话的消息外,它在所有消息中都是无用的。b。一些重要消息不会发送到对话框过程,特别是WM_CREATE。
-
您没有定义窗口的WNDCLASS,因此有一些事情您无法更改:默认的HBRUSH、默认的HICON、WNDCLASS标志等。使用
FindWindow
将成为PITA。 -
你不能在对话框中添加菜单,工具栏看起来很奇怪。
诚然,所有这些缺点都有解决办法,但这不是重点。
关于明显的优势:
-
"您可以使用对话框编辑器轻松地布局控件":实际上,应用程序主窗口不应该有那么多用户控件。想想你最喜欢的Windows应用程序,它在主窗口中有多少控件?只需将控件留给选项对话框或其他什么即可。
-
"焦点由底层对话框自动处理":如果主窗口中没有控件,这一点就没有意义了。此外,如果你真的必须这样做的话,处理焦点是微不足道的
我并不是说制作一个基于对话框的应用程序毫无意义;只是如果有更好的方法,你应该三思而后行,尤其是对于非琐碎的方法。
您可以将DialogBox视为由几个逻辑部分组成的复合体:
- 正在加载对话框定义资源
- 创建对话框窗口是通过对CreateWindow的多次调用在内部完成的:第一次调用对话框本身,然后调用模板中的控件
- 阻塞所有者窗口以支持"模态"并运行消息泵:GetMessage->IsDialogMessage或TranslateMessage+DispatchMessage
打个比方说,当程序流必须根据用户的决定进行分支时,这种组合非常有用,可以将该决定封装到对DialogBox()函数的单个调用中。这个函数确实做了很多工作,通过隐藏与原始Win32窗口交互的异步性质,简化了对程序的理解。
然而,如果Win32已经有消息循环,并且对DialogBox的调用是对特定消息的响应,那么这种"高度水平",特别是其中包含的消息循环,实际上可能会增加程序的复杂性。因此,在这种情况下,您必须注意嵌套的消息循环,尤其是当您在主消息循环中进行自定义消息处理时。
为了避免此类问题,可以使用CreateDialog函数,它也是一个复杂的函数,但仅包含第1部分和第2部分——它不会启动消息循环。因此,您必须提供自己的消息处理过程。如果需要的话,你也应该注意模态。
在我的实践中,对于非常小的实用程序应用程序,我只使用过几次DialogBox。
使用对话框作为应用程序的主窗口非常方便,以至于Visual Studio在创建新项目时将其作为一种选择。您可以使用资源编辑器布置窗口,创建对话框时将自动创建所有子窗口。
您甚至可以通过响应对话框的WM_PAINT消息来创建自己的自定义背景。
对话框的默认行为也很有用,例如通过响应TAB键来更改控制焦点。
- enum是C++中的宏变量还是整数变量
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 在命名空间中定义函数还是限定函数
- 架构决策:返回std::future还是提供回调
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 异常属于C++中的线程还是进程
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 如何在C++中确定文本文件中的元素是字符还是数字
- 返回值优化:显式移动还是隐式
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 为什么需要知道一个类是平凡的还是有平凡的构造函数
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在这种情况下,我真的复制了字节还是复制了字符?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- CIN是逻辑1还是0?
- i++还是++i更适合这个程序?
- 我应该将外部标头放在 .h 文件还是.cpp文件中?
- 正确的做法是什么,DialogBox还是CreateWindow