Form :: Close方法,FormClosing事件和CloseReason事件参数。设置自定义CloseReason?

时间:2013-10-31 11:39:44

标签: winforms c++-cli formclosing

这是与this one类似的问题,但我发现转换到C ++时答案不起作用。 FormClosing事件始终由用于关闭表单的任何方法触发,因此_programmaticClose的值在退出时始终为false。此外,调用基函数OnFormCLosing导致无限循环!

我需要区分“应用”按钮,“取消”按钮,“X”,Alt + F4等。

1 个答案:

答案 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方法,因此如果您想要发生任何特殊情况,则需要在该方法中编写额外的代码。