为什么按下关闭按钮时 MessageBox.Show 中的 return 而不是 "DialogResult.Cancel"?

Why is return from MessageBox.Show not "DialogResult.Cancel" when the close button is pressed?

我正在使用以下代码:

Dim Reply As DialogResult = MessageBox.Show("GOT IT!")
If Reply = DialogResult.OK Then '...` 

当我点击 Close 按钮(角落里的红色 "X")时,寻找 DialogResult.OK 的条件仍然计算为真,当我检查 Reply 变量的值时在单击关闭按钮后的运行时,它是 1 {OK}

MessageBox Class 上的文档说:

Displays a message window, also known as a dialog box, which presents a message to the user. It is a modal window, blocking other actions in the application until the user closes it. A MessageBox can contain text, buttons, and symbols that inform and instruct the user.

虽然我发现 DialogBoxes 上的文档有点令人费解和困惑,但在我看来(我可能错了)Close 按钮默认设置 return 到 IDCancel,我必须假设它以某种方式被 MessageBox class 解析为 DialogReturn.Cancel

那么为什么 MessageBox 没有像 DialogResult.Cancel 那样显示 return 表单关闭按钮??


这让我很困惑,因为似乎 MessageBox class 与同一 Systems.Windows.Forms 命名空间中的其他形式不一致。

例如,如果我们查看 Form Class's .DialogResult 方法的文档,它明确告诉我们来自关闭按钮的 return 是 DialogResult.Cancel

When a form is displayed as a modal dialog box, clicking the Close button (the button with an X in the top-right corner of the form) causes the form to be hidden and the DialogResult property to be set to DialogResult.Cancel.

您需要传入 MessageBoxButtons 作为包含取消按钮的覆盖,例如 MessageBoxButtons.OKCancel。

Dim message As String = "GOT IT!"
Dim caption As String = "Fancy Caption"
Dim Reply As DialogResult = MessageBox.Show(message, caption, MessageBoxButtons.OKCancel)
If Reply = DialogResult.OK Then '...` 

如果您不想要标题,请跳过它,但您仍然需要一个逗号,例如:

MessageBox.Show("GOT IT!",,MessageBoxButtons.OKCancel)

有关 MessageBoxButton 选项的完整枚举,请参阅 here

正如上面评论中所述,只有当您添加包含取消选项的 MessageBoxButtons 枚举时,您才能在单击关闭红色按钮时获得 IDCancel 结果例如 MessageBoxButtons.OKCancel

MessageBox.Show 方法确实是 WinApi MessageBox function. You could see this wrapping looking at the reference sources

的包装器

MessageBox.Show 的行为与您指出的 link 不同。那是与 WinForm 引擎相关的,当然 WinForm Form class 的行为完全由库管理,以处理为 WinForm class.

假定的场景

在 WinApi 文档中,您可以在有关 Return 值的部分中找到一个微妙的参考,他们在其中讨论了出现取消按钮时的行为。然后反复试验证实了这个假设。