【问题标题】:Form::Close method, FormClosing event, and CloseReason event argument. Set custom CloseReason?Form::Close 方法、FormClosing 事件和 CloseReason 事件参数。设置自定义 CloseReason?
【发布时间】:2013-10-31 19:59:31
【问题描述】:

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

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

【问题讨论】:

    标签: winforms c++-cli formclosing


    【解决方案1】:

    房产

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

    【讨论】:

    • 最后,根据您的回答,我发现最简单的方法是将 _programmaticClose(或等效项)默认设置为 false。然后当且仅当应用按钮被按下时,我将其设置为 true。所以根本不需要 FormClosing。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2010-10-24
    • 2016-09-27
    相关资源
    最近更新 更多