如何在winforms C#中最大化/取消最大化窗体时触发Control.MouseMove事件



在我的表单中,我有几个控件,每个控件都有一个MouseMove事件处理程序。当窗体最大化/取消最大化时,我如何触发这些事件(Control.MouseMove)?下面的代码演示了如何将事件处理程序分配给每个控件。感谢您的帮助和建议。

control.MouseMove += delegate(object sender, MouseEventArgs e)
{
    if (Dragging)
    {
        if (direction != Direction.Vertical)
        container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
        if (direction != Direction.Horizontal)
            container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
     }
};

事件只能由每个定义的实现类触发。但是,您可以将MouseMove、Maximize和Minimize事件的目标定为在与原始MouseMove代理相同的范围内创建的同一个非匿名代理,以保留对本地变量的使用。

不过,您需要自己在表单中创建最大化和最小化事件,因为winforms中没有提供这些事件(请参阅窗口最大化/未最大化时的事件)

public event Action<object> Maximized;
public event Action<object> Minimized;
protected override void WndProc(ref Message m) {
    if (m.Msg == 0x0112) { // WM_SYSCOMMAND
        // Check your window state here
        if (m.WParam == new IntPtr(0xF030) && Maximized != null) Maximized(this);// Maximize event - SC_MAXIMIZE from Winuser.h
        if (m.WParam == new IntPtr(0XF020) && Minimized != null) Minimized(this);// Minimize event - SC_MINIMIZE from Winuser.h
    }
    base.WndProc(ref m);
}

您以前的代码可以重新编写为:

var MMove = new Action<Point>(mousePosition =>
{
    if (Dragging)
    {
        if (direction != Direction.Vertical)
            container.Left = Math.Max(0, mousePosition.X + container.Left - DragStart.X);
        if (direction != Direction.Horizontal)
            container.Top = Math.Max(0, mousePosition.Y + container.Top - DragStart.Y);
    }
});
this.MouseMove += (sender,e) => MMove(e.Location);
this.Maximized += (sender) => MMove(MousePosition);
this.Minimized += (sender) => MMove(MousePosition);

最新更新