【问题标题】:Message boxes with own button texts带有自己的按钮文本的消息框
【发布时间】:2015-08-12 07:45:08
【问题描述】:

Windows 上的许多应用程序仅显示带有“是”/“否”或“确定”/“取消”按钮的普通消息框。通常,在非英语 Windows 上,文本是英语会变得更糟,但按钮是用 Windows 的语言标记的。

是否没有简单的 API 来显示带有自己的按钮标签的消息框,例如“删除”还是“保留”?

【问题讨论】:

  • 由于缺少本地化资源,您处理语言不匹配的解决方案似乎是转到the whole nine yards 并打破系统提供的本地化支持以匹配您的本地化支持。真正的解决方案是本地化您的资源。
  • ... 或者,如果无法选择每种语言的本地化,至少让应用程序本身保持英语。我的主要问题是使用是/否,因为这是糟糕的 GUI 设计。相反,使用一个(或很少几个)特定于对话框的单词会更好,因为用户不必总是阅读整个对话框来理解按钮。
  • 如果用户不必阅读整个对话框来理解按钮,那么您在对话框中放置了太多文本。如果您无法选择本地化,那么请不要破坏 本地化的部分。我敢肯定,使用辅助技术的人会讨厌您提出自己的有用解释。
  • @IInspectable 任务对话框 api 的主要目标之一是为开发人员提供一种方法来显示带有按钮的对话框,这些按钮可以清楚地识别操作。呈现复杂的选择和 OK/Cancel 或 Yes/No 是一种已知的 UI 反模式。查看所有现代操作系统中的一些对话框。与 MessageBox 标准集名称不同的按钮很普遍。

标签: windows winapi


【解决方案1】:

确实有这样的Win32功能。它是TaskDialogIndirect。请注意,它是在 Vista 中引入的,因此如果您仍在尝试支持 XP,那么您需要为该平台提供一个后备选项。

【讨论】:

    【解决方案2】:

    就像 DavidHeffernan 说的,你应该使用TaskDialogIndirect(),因为它本身就支持自定义按钮。不过,它仅适用于 Vista 及更高版本。

    在 XP 和更早版本上,您可以通过使用 SetWindowsHookEx() 安装线程本地 WH_CBT 挂钩,或使用 SetWinEventHook() 来自定义标准 MessageBox()(或者实际上是您想要的任何自定义)上的按钮标题,要在创建对话框时获取对话框的HWND,然后您可以随意操作对话框。您可以使用GetDlgItem() 获取各个按钮的HWND(因此可以使用标准API 函数/消息),和/或使用GetDlgItemText() 更改它们的标题。每个按钮的 CtrlID 与单击该按钮时MessageBox() 返回的值相同。

    【讨论】:

    • 也希望MS不要发布以不同方式实现对话框的操作系统。
    • @DavidHeffernan:显然,在现代操作系统版本上应该使用TaskDialogIndirect(),因为它本身就支持自定义按钮。我建议仅在 XP 和更早版本的 MessageBox() 行为已被锁定的情况下使用此技巧。
    【解决方案3】:

    这个Projct on Codeproject 提供了一个很好的替代MessageBox,它允许替换按钮标签以及其他功能。

    它基本上是一个重写的MessageBox 函数,它是标准Windows MessageBox 函数的超集。提供了完整的源代码,因此您可以在需要时轻松适应您的需求。

    而且是纯Win32,这里不涉及MFC。

    【讨论】:

    • How do I write a good answer?: "为链接提供上下文:鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及它为什么存在. 始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。”
    • @IInspectable,我同意这个答案很简短,但我不想从 codeproject 复制/粘贴内容或添加更多信息,因为:1) 所需的一切都在代码项目链接。 2) Codeproject 已经存在多年并且不太可能消失。 3) 如果 codeproject 应该停止,那么答案中的任何上下文信息都将毫无用处。
    • 这是一个常见的错误:文档的生命周期和托管站点的生命周期不必重合。即使明天可以访问 stackoverflow,您也可以决定删除您的答案,使其无法访问(无论如何对公众来说)。
    • @IInspectable 我只是稍微扩展了答案。现在可以了吗?
    • 如果您问这个问题,您的回答(没有外部资源)是否能提供足够的信息来帮助您解决问题?我相信答案是“否”。相关信息包括,解决方案是如何实现的(它是标准消息框的子类吗?它是否实现了自己的对话框?它是否使用对话框管理器的对话框模板支持?等等)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    相关资源
    最近更新 更多