这是与this one类似的问题,但我发现转换到C ++时答案不起作用。 FormClosing事件始终由用于关闭表单的任何方法触发,因此_programmaticClose的值在退出时始终为false。此外,调用基函数OnFormCLosing导致无限循环!
我需要区分“应用”按钮,“取消”按钮,“X”,Alt + F4等。
答案 0 :(得分:0)
属性
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方法,因此如果您想要发生任何特殊情况,则需要在该方法中编写额外的代码。