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

时间:2012-01-12 18:41:48

标签: c++ c winapi

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。我没有看到理由。

感谢您的回答以及您阅读我的翻译所花费的时间

3 个答案:

答案 0 :(得分:2)

根据我的经验,使用DialogBox作为主窗口应用程序起初看起来很容易,但后来会非常不舒服,特别是如果您使用DialogBox()(而不是CreateDialog()进行对话:

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

  2. 您不是编写消息过程而是编写对话框过程。并且存在很多差异,这是我能想到的最重要的区别:

    一个。返回值不是消息中记录的真实LRESULT,而是BOOL,除了极少数仅限对话的消息外,它们几乎没用。

    湾一些重要的消息不会发送到对话程序,特别是WM_CREATE。

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

  4. 您无法在对话框中添加菜单,工具栏看起来很奇怪。

  5. 当然,所有这些缺点都有解决方法,但这不是重点。

    关于明显的优势:

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

    2. “焦点由底层对话框自动处理”:如果主窗口中没有控件,这一点没有实际意义。而且,如果你真的需要,处理焦点是微不足道的。

    3. 我并不是说制作基于对话框的应用程序没有意义;如果有更好的方法,你应该三思而后行,特别是对于非平凡的方式。

答案 1 :(得分:1)

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

  1. 加载对话框定义资源;
  2. 创建对话窗口,该窗口通过多次调用CreateWindow在内部完成:第一个用于对话框本身,然后用于在模板中找到的控件;
  3. 阻止所有者窗口以支持“模态”并运行消息泵:GetMessage - &gt; IsDialogMessage或TranslateMessage + DispatchMessage。
  4. 比喻说,当你的程序流程必须根据用户的决定进行分支,将该决策封装到DialogBox()函数的单个调用中时,这个组合非常有用。这个函数确实做了很多工作,通过隐藏与原始Win32窗口交互的异步特性,简化了对程序的理解。

    然而,这个'高级别',特别是其中包含的消息循环,实际上可能会增加程序的复杂性,如果它已经Win32有消息循环并且对DialogBox的调用是作为对特定消息的响应而作出的。因此,在这种情况下,您必须注意嵌套的消息循环,特别是如果您是主消息循环中的自定义消息处理。

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

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

答案 2 :(得分:0)

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

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

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