【问题标题】:Create Dialog Box with push buttons created dynamically使用动态创建的按钮创建对话框
【发布时间】:2021-02-24 07:47:41
【问题描述】:

我想创建一个基于 Win32 的模式对话框,其中按钮的实际标签在创建时作为输入接收。例如,单击一个按钮可能会导致出现另外两个按钮。由于在编译时不知道按钮属性,我假设使用资源文件不是解决方案。我也不想隐藏/禁用按钮,而只是动态生成它们。

按钮的数量可以变化,但必须保持顺序。例如,按钮的顺序可以是以下任意一种:

A, B, C, D, E

B, C, E

C

A, B, E

我不想拥有以下内容

[A] B [C] D [E] 其中[X] 表示灰色按钮

[ ] B [ ] D [ ] 其中[ ] 表示空白空间

我进行了一些在线搜索,其中使用 CreateWindow()CreateWindowEx() 似乎是一种/一种使用方式,但我找不到简单的工作示例。

微软在任何地方都有这样的示例代码吗?

【问题讨论】:

  • “我也不想隐藏/禁用按钮,而只是动态生成它们。” - 为什么?您试图通过创建/销毁而不是显示/隐藏控件来防止什么问题?
  • 我不想显示灰色的禁用按钮,我想显示 B C D 而不是:[A] B C D [E],其中 [X] 表示灰色按钮
  • 隐藏的按钮根本不显示。
  • "如果每个控件都有 (x,y,width,height) 值,那么隐藏的控件不会在该位置留下空白空间” - 是的。 “除非所有其他控件都以某种方式移动?” - 是什么阻止您自己移动它们?您正在创建控件,将它们移动到任何您想要的位置,例如使用SetWindowsPos()。跟踪您创建的 HWND 以及您希望在任何给定时间显示的 HWND。然后,您可以遍历该列表,隐藏您不希望显示的列表,并在您希望显示的列表中移动。
  • 另一种思路,你创建一个结构体,一个参数是一个包含足够坐标的数组,另一个是每个坐标的状态。每当创建按钮时,都会从数组中提取坐标并将坐标设置为使用时的坐标。如果按钮被销毁,则坐标设置为未使用。其余按钮根据此坐标重新排序。

标签: windows winapi visual-c++ dialog win32gui


【解决方案1】:

鉴于您的描述(只需更改一些按钮标签),我将从资源文件开始。

创建对话框后,您可以使用GetDialogItem 检索您需要更改其标签的按钮的窗口句柄。然后您可以使用SetWindowText 设置该控件的标签。

同样,单击一个按钮会出现另外两个按钮。在这种情况下,最初不可见的两个按钮将在资源文件中标记为不可见。然后当用户单击第一个按钮时,您将其他两个按钮设置为可见。

附带说明:在大多数情况下,最好禁用其他两个按钮而不是实际隐藏它们。 Windows 会将它们绘制成灰色,因此用户会认识到单击它们不会产生任何效果(目前),但它仍然清楚地表明其他一些操作将启用它们。

至少根据我的经验,从资源文件开始并根据需要操作控件通常(相当)容易,而不是尝试从头开始自己创建完整的对话框 - 没有什么您在问题中提到的方法是我认为完全由您自己创建对话框的理由。

不过,为了完整起见,如果您决定确实需要这样做,您可能需要查看CreateDialogIndirect。这使您可以构建一个数据结构来定义对话框及其包含的控件,然后创建一个实现它们的对话框。

【讨论】:

  • 我最初考虑过这个问题,但是我将如何处理可变数量的按钮。我刚刚用上面的一些例子更新了我的问题。
  • 我和你差不多在同一时间编辑,添加了对CreateDialogIndirect的引用。它可以/确实有效,但至少根据我的经验,使用它非常痛苦。使用CreateWindow 自己创建容器和所有控件更糟糕——创建东西很容易,但处理控件之间的选项卡显然不是一件容易的事。这些中的任何一个都可以完成,但就您所描述的而言,我 99% 确定使用资源文件以及根据需要隐藏/显示/移动按钮会更容易。
  • 我查看了 CreateDialogIndirect,在遇到一些困难后,我能够以编程方式生成模板(参考:docs.microsoft.com/en-us/windows/win32/dlgbox/…),但似乎一旦在内存中使用此模板创建 DialogBox,它就可以不能改变。或者可以改吗?
  • @cpp19:一旦创建,它就像一个普通的对话框。要进行更改,请修改您提供给 CreateDialogIndirect 的数据并创建一个包含修改的新对话框。
  • 最好的办法就是使用 mfc。您可以在 winapi 上查看 petzold,但怀疑这样做是否值得
猜你喜欢
  • 2016-04-21
  • 2012-06-24
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 2012-02-14
  • 2016-04-28
  • 1970-01-01
  • 2020-02-21
相关资源
最近更新 更多