【问题标题】:ResizeEnd event is not triggered when resizing the form by maximize button?通过最大化按钮调整表单大小时不会触发 ResizeEnd 事件?
【发布时间】:2016-09-23 05:16:09
【问题描述】:

在我的应用程序中,ResizeEnd 事件在通过拖动角来调整表单大小时触发,但在我单击最大化按钮时不会触发。

Resize 事件在我的场景中不起作用,因此我需要使用 ResizeEnd 事件。

为什么在通过最大化按钮调整表单大小时没有触发此事件?或者任何人都可以提出替代方案?

【问题讨论】:

    标签: c# .net winforms events resize


    【解决方案1】:

    ResizeEnd 事件在用户完成调整表单大小时引发,通常通过拖动其中一个边框或位于表单右下角的大小调整手柄,然后释放它。它也会在用户移动表单时引发。

    如果出于任何原因您需要最大化窗口导致引发ResizeEnd 事件,您可以通过这种方式引发事件:

    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MAXIMIZE = 0xF030;
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_SYSCOMMAND) 
        {
            if (m.WParam == (IntPtr)SC_MAXIMIZE) 
            {
                //the window has been maximized
                this.OnResizeEnd(EventArgs.Empty);
            }
        }
    }
    

    注意

    • Resize 事件也会在表单最大化时引发。
    • 如果您想处理自定义布局,Layout 事件是一个合适的事件。

    【讨论】:

    • 嗨 Reza,感谢您的回答。在我的来源中,我使用 Form 作为属性。所以我无法通过 Form 访问 OnResizeEnd raise 方法。
    • 嗨,不客气 :) 如果该表单是您的表单之一,您可以简单地将此类代码添加到应用程序所有表单的公共基础 Form 中。但是,如果它不是您的表单,并且您无权访问其非公共成员来覆盖 WndProc 并调用 OnResizeEnd,您也可以对另一个您无权访问的 Form 应用类似的解决方案这是非公共方法。
    • 谢谢。非常有帮助。如果有人想知道,我还添加了以便事件在还原时触发 const int SC_RESTORE = 0xF120
    • 另外,如果用户通过双击标题最大化/恢复窗口,将发送稍微不同的消息:0xF0320xF122
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多