0

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

我需要区分应用按钮、取消按钮、'X'、Alt+F4 等。

4

1 回答 1

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

于 2013-10-31T11:56:41.180 回答