【问题标题】:Message box with Validate and Cancel buttons带有验证和取消按钮的消息框
【发布时间】:2011-06-29 10:48:49
【问题描述】:

我怎样才能有一个带有两个按钮验证和取消的消息框?

【问题讨论】:

    标签: .net windows vb.net messagebox


    【解决方案1】:

    很遗憾,标准 Win32 MessageBox function 不支持带有自定义标签的按钮。而且由于 VB.NET MsgBox 函数是对该本机函数的薄包装,因此它也不支持它们。预定义的值就是你得到的所有值,这意味着你能做的最好的事情就是“OK”和“Cancel”,并附上文字说明“OK”意味着“继续验证”。

    值得注意的是,多年来,这是 Windows 样式指南认可的推荐做法。事实上,它看起来像it still is。具体来说,请注意以下一般规则的例外情况:

    使用对主要指令做出特定响应的肯定提交按钮,而不是像 OK 或 Yes/No 这样的通用标签。用户应该能够通过单独阅读按钮文本来理解选项。
    例外情况:

    • 对没有设置的对话框使用关闭,例如信息对话框。切勿对有设置的对话框使用关闭。
    • 当“特定”响应仍然是通用的时使用 OK,例如保存、选择或选择。
    • 在更改特定设置或设置集合时使用“确定”。
    • 对于没有主要说明的旧版对话框,您可以使用通用标签,例如 OK。此类对话框通常不是为执行特定任务而设计的,因此无法做出更具体的响应。
    • 某些任务需要更多思考和仔细阅读,用户才能做出明智的决定。这通常是确认的情况。 在这种情况下,您可以故意使用通用提交按钮标签来强制用户阅读主要说明并防止草率做出决定。


    Windows Vista 引入了一个新的 API,旨在取代陈旧且无法配置的 MessageBox — 它称为 TaskDialog。如果您运行的是 Windows Vista 或 7,那么毫无疑问,您已经在整个 Windows shell 中看到了这个对话框。事实上,它允许您为每个按钮指定自定义名称,并提供一系列其他自定义选项。但这种控制并不是免费的。 TaskDialog函数有两个问题:

    1. .NET Framework 不包括开箱即用的包装器。您需要编写自己的简单包装器,或下载包含此类包装器的Windows API Code Pack。但这会给你的代码增加额外的依赖——你必须决定这是否值得。

    2. 由于 API 仅在 Vista 中引入,这意味着程序只能在 Vista 或更高版本上运行时使用它。如果您仍然需要以 Windows XP(或 2000)为目标,那么您就不走运了。显示TaskDialog 的代码将失败,您需要包含一个备用例程来显示标准MessageBox。这当然会让你回到你开始的地方,而无法在那些旧操作系统上自定义按钮标签。同样,只有您可以决定这是否是您的应用程序和/或部署方案的重要问题。

    几代 VB 程序员使用的另一个选项是创建您自己的小MessageBox 样式表单。布置一个简单的表单并放置一个图标/图像、一些标题文本和您想要的所有按钮并不难。由于您已经创建了整个表单,因此您可以随意根据自己的代码自定义它。

    如果您绝对在 Vista 之前的 Windows 版本中需要此功能,那么创建自己的消息框表单是您唯一的选择。否则,我强烈建议您利用新的 TaskDialog API。在您的应用程序中这样做可以提高与用户可能安装在其计算机上的其他应用程序的一致性,甚至与 Windows 本身的一致性。很难确保您自己的自定义消息框表单得到正确的处理,例如根据标签文本的长度和用户的屏幕大小自动换行。并显示/隐藏标题栏中的“X”关闭按钮,具体取决于您的对话框是否包含“取消”按钮。标准 Windows MessageBox/TaskDialog 为您免费提供的其他许多功能令人难以置信,您无需费力。这只是对一般原则的重申:当你不是绝对必须这样做时,永远不要重新发明轮子。

    一个好的折衷方案可能是使用this TaskDialog wrapper/emulator 之类的东西。在 Vista 及更高版本中,当本机 TaskDialog API 可用时,它会自动调用该函数。否则,它使用标准形式并尝试模拟本机TaskDialog API 的行为。我写了一个类似的自定义类供我自己使用,但我从来没有把它发布到网上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多