整个窗口上的MouseHover / MouseLeave事件

时间:2010-01-06 18:01:54

标签: c# winforms events mouseleave mousehover

我有Form子类,包含MouseHoverMouseLeave的处理程序。当指针位于窗口的背景上时,事件可以正常工作,但当指针移动到控件里面窗口时,它会导致MouseLeave事件。

无论如何都有一个覆盖整个窗口的活动。

(。NET 2.0,Visual Studio 2005,Windows XP。)

4 个答案:

答案 0 :(得分:8)

只要鼠标进入子控件

,就覆盖MouseLeave事件不会触发
    protected override void OnMouseLeave(EventArgs e)
    {
        if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
            return;
        else
        {
            base.OnMouseLeave(e);
        }
    }

答案 1 :(得分:6)

没有好办法让MouseLeave对容器控件可靠。用计时器解决这个问题:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        timer1.Interval = 200;
        timer1.Tick += new EventHandler(timer1_Tick);
        timer1.Enabled = true;
    }

    private bool mEntered;

    void timer1_Tick(object sender, EventArgs e) {
        Point pos = this.PointToClient(Cursor.Position);
        bool entered = this.ClientRectangle.Contains(pos);
        if (entered != mEntered) {
            mEntered = entered;
            if (!entered) {
                // Do your leave stuff
                //...
            }
        }
    }
}

答案 2 :(得分:6)

当鼠标离开事件被触发时,一个选项是检查指针的当前位置并查看它是否在表单区域内。我不确定是否有更好的选择。

编辑:我们有一个类似的问题,您可能会感兴趣。 How to detect if the mouse is inside the whole form and child controls in C#?

答案 3 :(得分:0)

在您的用户控件上为您的控件创建一个mousehover事件,像这样(或其他事件类型)

private void picBoxThumb_MouseHover(object sender, EventArgs e)
{
    // Call Parent OnMouseHover Event
    OnMouseHover(EventArgs.Empty);
}

在托管UserControl的WinForm上,UserControl可以处理MouseOver,因此将其放在Designer.cs中

this.thumbImage1.MouseHover += new System.EventHandler(this.ThumbnailMouseHover);

在WinForm上调用此方法

private void ThumbnailMouseHover(object sender, EventArgs e)
{

    ThumbImage thumb = (ThumbImage) sender;

}

ThumbImage是usercontrol的类型