Hello亲爱的有经验的用户,
我已经在windows中编程了一段时间,我一直有这个问题What is the right thing to do when creating a user interface?
是否对资源脚本中的UI执行操作并调用DialogBox。
或者是第一次创建WNDCLASS结构更繁琐的方式声明字段,RegisterClass(& wc)并使用CreateWindow,最后它的相同功能只是初始化更容易使用DialogBox并且你放弃了abit控制上课。
我猜你会问这个应用程序的目的是什么,当然我可以说它是一个皮肤应用程序(然后我会使用CreateWindow),如果它是一个简单的计算器应用程序,我会去Dialogbox。
但专业人士的目标是什么?
请保留在win32区域,因为我不会讨论是否将QT或Java用于那些类型的应用程序,我在框架上的立场是他们添加了大量不必要的开销,java JRE和QT额外的DLL和.NET所有这些都为用户添加了安装这些文件的要求,如果不是,则需要下载所有这些文件。这些文件位于>的区域内。 20 mb。我没有看到理由。
感谢您的回答以及您阅读我的翻译所花费的时间
答案 0 :(得分:2)
根据我的经验,使用DialogBox作为主窗口应用程序起初看起来很容易,但后来会非常不舒服,特别是如果您使用DialogBox()
(而不是CreateDialog()
进行对话:
您无法控制消息循环。迟早你会想要添加一个pre-TranslateMessage步骤,或者一个空闲处理或类似的东西。为此,您需要编写自己的消息循环。
您不是编写消息过程而是编写对话框过程。并且存在很多差异,这是我能想到的最重要的区别:
一个。返回值不是消息中记录的真实LRESULT
,而是BOOL
,除了极少数仅限对话的消息外,它们几乎没用。
湾一些重要的消息不会发送到对话程序,特别是WM_CREATE。
您没有定义窗口的WNDCLASS,因此有些事情您无法更改:默认HBRUSH,默认HICON,wndclass标志等。使用FindWindow
成为PITA。< / p>
您无法在对话框中添加菜单,工具栏看起来很奇怪。
当然,所有这些缺点都有解决方法,但这不是重点。
关于明显的优势:
“您可以使用对话框编辑器轻松布局控件”:实际上,应用程序主窗口不应该有这么多用户控件。想想你最喜欢的Windows应用程序,它在主窗口中有多少控件?只需将控件保留在选项对话框中,或者其他内容。
“焦点由底层对话框自动处理”:如果主窗口中没有控件,这一点没有实际意义。而且,如果你真的需要,处理焦点是微不足道的。
我并不是说制作基于对话框的应用程序没有意义;如果有更好的方法,你应该三思而后行,特别是对于非平凡的方式。
答案 1 :(得分:1)
您可以将DialogBox视为由多个逻辑部分组成的复合体:
比喻说,当你的程序流程必须根据用户的决定进行分支,将该决策封装到DialogBox()函数的单个调用中时,这个组合非常有用。这个函数确实做了很多工作,通过隐藏与原始Win32窗口交互的异步特性,简化了对程序的理解。
然而,这个'高级别',特别是其中包含的消息循环,实际上可能会增加程序的复杂性,如果它已经Win32有消息循环并且对DialogBox的调用是作为对特定消息的响应而作出的。因此,在这种情况下,您必须注意嵌套的消息循环,特别是如果您是主消息循环中的自定义消息处理。
为了避免这样的问题,可以使用CreateDialog函数,它也是一个复杂的但只有第1和第2部分 - 它不会启动消息循环。因此,您必须提供自己的消息处理过程。如果需要,你还应该注意模态。
在我的实践中,我只使用DialogBox几次用于非常小的实用程序应用程序。
答案 2 :(得分:0)
使用对话框作为应用程序的主窗口是非常方便的,Visual Studio在创建新项目时将其作为选项包含在内。您可以使用资源编辑器布置窗口,并在创建对话框时自动创建所有子窗口。
您甚至可以通过回复对话框的WM_PAINT消息来自己创建自定义背景。
对话框默认行为也很有用,例如通过响应TAB键来更改控件焦点。