【问题标题】:How do I add a window from the resources as a child window?如何从资源中添加一个窗口作为子窗口?
【发布时间】:2013-09-26 11:00:58
【问题描述】:

我正在使用 win32 创建一个窗口:

HWND mainWnd = CreateWindow(...);

现在我可以添加 gui 元素作为 mainWnd 的子元素。然而,这很快就会变得有点乏味,我想使用 Visual Studio 内置的设计器来帮助我。 我注意到在添加资源下有一个对话框条目。在 IDD_FORMVIEW 对话框中似乎是最通用的,所以我添加了其中一个。接下来我使用设计器为其添加了 gui 元素。

现在我想将它用作我的 mainWnd 的子项。 我该怎么做?

我找到了一些使用 DialogBox 的示例,但我不想要一个单独的对话框,我希望这个窗口作为我的 mainWnd 的子窗口。

【问题讨论】:

  • 你走错了方向。资源编辑器真的只适合编辑对话框,肯定不是UI设计师。看看更现代的产品,Winforms 和 WPF 有非常有效的设计师。 Qt 对 C++ 代码的表现非常好。
  • 谢谢汉斯。问题是我必须编写非托管代码(C++)。 Qt 的问题是我无法控制消息循环,因为我正在为 3rd 方程序开发插件。
  • @HansPassant:不完全正确。例如。对话框子窗口,例如for tab 控件可以这样设计。

标签: windows winapi


【解决方案1】:

Visual Studio 中的设计器适用于创建对话框,而不是任意窗口。

话虽如此,有几种方法(按难度递增的顺序):

  1. 将主窗口设为对话框。 Petzold's book 有一个使用对话框作为程序主窗口的示例。 (如果我没记错的话,是计算器的例子。)

  2. 创建对话框并在显示之前将其样式更改为WS_CHILD,将其扩展样式更改为WS_EX_CONTROLPARENT,并将其作为主窗口的父级。要使所有导航功能正常工作,您必须在消息泵中添加IsDialogMessage 调用。这是可行的,但可能很难让一切正常运行。

  3. 混合 1 和 2 为主窗口创建一个对话框,然后为内容创建第二个对话框(使用 DS_CONTROL),然后将第二个对话框放在第一个对话框中。我自己从未尝试过这种方法,但它似乎应该有效。

  4. 编写自己的代码来解析对话框资源并创建子窗口,这基本上是在重做CreateDialog为您所做的很多工作。

鉴于您希望使用 GUI 来设计 UI,我怀疑只有第一个解决方案足够简单以至于您会感兴趣。

【讨论】:

    【解决方案2】:

    使用 CreateDialog API 从资源中创建窗口。如果您不希望它看起来像一个对话框,请从资源属性中删除标题栏样式。

    【讨论】:

      【解决方案3】:

      要使用从对话框资源模板创建的对话框,您必须在模板中指定 DS_CONTROL 窗口样式。

      阅读有关对话框的更多信息here

      对话资源解释here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多