这是一个与此问题类似的问题,但我发现在转换为 C++ 时答案不起作用。FormClosing 事件始终由用于关闭表单的任何方法触发,因此 _programmaticClose 的值在退出时始终为 false。此外,调用基函数 OnFormCLosing 会导致无限循环!
我需要区分应用按钮、取消按钮、'X'、Alt+F4 等。
这是一个与此问题类似的问题,但我发现在转换为 C++ 时答案不起作用。FormClosing 事件始终由用于关闭表单的任何方法触发,因此 _programmaticClose 的值在退出时始终为 false。此外,调用基函数 OnFormCLosing 会导致无限循环!
我需要区分应用按钮、取消按钮、'X'、Alt+F4 等。
该物业
FormClosingEventArgs.CloseReason
是只读的,因此您不能在触发 Closing 事件后手动更改它。
您需要做的是定义您自己的 CloseReason 枚举。
enum CloseReason
{
Apply, Cancel, X, AltF4 // etc...
}
并在表单中添加两个变量:
private:
bool forceClose = false;
CloseReason closeReason;
然后在 FormClosing 方法中,编写这段代码(这里我假设事件触发了一个名为 Form1_FormClosing 的方法):
void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
if (!forceClose)
e->Cancel = true;
}
因此,默认情况下,当用户尝试关闭表单时,表单实际上不会关闭。
现在,对于关闭表单的每个“替代”方法,您需要编写另一个事件处理程序来告诉表单它是如何关闭的,以及在适当的情况下实际关闭它。例如,如果您有一个名为 ApplyButton 的按钮要关闭您的表单:
void ApplyButton_Click(Object sender, EventArgs e)
{
closeReason = CloseReason::Apply;
forceClose = true;
this->Close();
}
只需对其他关闭方法重复该格式即可。当您的用户使用“X”关闭表单时,只会调用 FormClosing 方法,因此如果您希望发生任何特殊情况,您需要在该方法中编写额外的代码。