【问题标题】:How can I create a "Yes To All" Button using WinAPI?如何使用 WinAPI 创建“全部同意”按钮?
【发布时间】:2010-10-23 16:00:36
【问题描述】:

我们有一个使用 WinAPI 的 C 语言编写的遗留应用程序。我们想在我们的一些对话框中添加一个“全部是”按钮。不幸的是,现有的 MessageBox 功能不允许自定义按钮或按钮标题。

最好的方法是什么?是否有一个巧妙的技巧可以轻松添加自定义按钮?还是我们应该创建自己的 MessageBox 替代品?

【问题讨论】:

  • 嗯,创建一个按钮并给它一个标题“Yes To All”?我认为你需要更具体一点。
  • WinAPI 中的MessageBox 显然不允许创建自己的按钮并为其提供自定义标题。那将是我尝试的第一件事。
  • 可以自定义MessageBox()。在调用 MessageBox() 之前,使用 SetWindowsHookEx() 安装特定于线程的 CBT 挂钩。当钩子被触发时,你将可以访问对话框的 HWND,并且可以做任何你想做的事情(添加额外的子控件、移动控件、更改文本等)。

标签: winapi dialog


【解决方案1】:
【解决方案2】:

WinAPI 中还有另一种消息框,从 Windows 2000 开始。它是SHMessageBoxCheck

它允许您显示一个标准的MB_OKCANCEL/MB_YESNO/MB_OK-type MessageBox,并通过指定在这种情况下的默认选项来选择不再显示它。

也许它并不完全符合您的要求,但它与 Windows UI 相当一致。

在 Vista 中,大多数 shell 的“全部同意”对话框实际上都以这种方式工作 - 没有额外的按钮显示“全部同意/否” - 而是有一个“对所有项目执行所选操作”复选框。

但是文档中的注释让我担心:

此功能可通过 Microsoft Windows XP 和 Windows Server 2003 使用。它可能会在 Windows 的后续版本中更改或不可用。

【讨论】:

    【解决方案3】:

    您可能还需要注意文本换行,使其类似于MessageBox。此外,MessageBox 使用与默认 GUI 字体不同的字体。并且不要忘记在弹出对话框时播放声音:)

    【讨论】:

      【解决方案4】:

      我们刚刚创建了自己的 DIALOGEX 替换资源模板,然后只需调用 DialogBox() 并检查返回值。

      参考:http://msdn.microsoft.com/library/ms644996(v=VS.85).aspx#modal_box

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 1970-01-01
        相关资源
        最近更新 更多