带有验证和取消按钮的消息框

Fur*_*gal 4 .net vb.net windows messagebox

我怎么能有一个msgbox有两个按钮,验证和取消?

Cod*_*ray 7

不幸的是,标准的Win32 MessageBox功能不支持带有自定义标签的按钮.由于VB.NET MsgBox函数是原始函数的一个瘦包装器,它也不支持它们.您可以获得预定义的值,这意味着您可以做的最好的事情就是"确定"和"取消",文本说明"确定"意味着"继续验证".

值得注意的是,多年来,这是Windows风格指南所赞同的推荐做法.事实上,它看起来仍然是.具体而言,请注意以下一般规则的例外情况:

使用对主指令的特定响应的肯定提交按钮,而不是诸如OK或Yes/No之类的通用标签.用户应该能够通过单独阅读按钮文本来理解选项.
例外:

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


Windows Vista引入了一个新的API,旨在取代老化和不可能配置MessageBox- 称为TaskDialog.如果您运行的是Windows Vista或7,那么您无疑会在整个Windows shell中看到此对话框.事实上,它允许您为每个按钮指定自定义名称,并提供一系列其他自定义选项.但这种控制并不是免费的.该TaskDialog功能有两个问题:

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

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

几代VB程序员使用的另一个选择是打开你自己的小型MessageBox表单.布置一个带有图标/图像的位置,一些标题文本和所需的所有按钮的简单表单并不难.由于您已经创建了整个表单,因此您可以根据需要随意自定义代码.

如果您在Vista之前的Windows版本中绝对需要此功能,那么创建自己的消息框表单是您唯一的选择.否则,我强烈建议您利用新TaskDialogAPI.在您的应用程序中执行此操作可以提高用户可能已在其计算机上安装的其他应用程序的一致性,甚至可以使用Windows本身.很难确保您自己的自定义消息框表单获得正确的小触摸,例如根据标签文本的长度和用户的屏幕大小自动包装标签文本.并根据对话框是否包含"取消"按钮显示/隐藏标题栏中的"X"关闭按钮.还有一个令人难以置信的其他东西,标准Windows MessageBox/ TaskDialog为您免费提供,而无需抬起手指.这只是对一般原则的重述:当你不是必须这样做时,永远不要重新发明轮子.

一个很好的折衷方案可能是使用类似这个TaskDialog包装器/模拟器的东西.在Vista及更高版本中,本机TaskDialogAPI可用,它会自动调用该函数.否则,它使用标准表单并尝试模拟本机TaskDialogAPI 的行为.我为自己编写了一个类似的自定义类,但我从来没有在网上发布它.