MouseHover / MouseLeave событие на всё окно - PullRequest
9 голосов
/ 06 января 2010

У меня есть подкласс Form с обработчиками для MouseHover и MouseLeave. Когда указатель находится на фоне окна, события работают нормально, но когда указатель перемещается на элемент управления внутри окна, это вызывает событие MouseLeave.

Есть ли в любом случае событие, охватывающее все окно?

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

Ответы [ 4 ]

8 голосов
/ 30 августа 2012

Ovveride событие MouseLeave, чтобы не вызывать, пока мышь входит в дочерний элемент управления

    protected override void OnMouseLeave(EventArgs e)
    {
        if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
            return;
        else
        {
            base.OnMouseLeave(e);
        }
    }
6 голосов
/ 06 января 2010

Когда событие отпускания мыши запускается, один из вариантов - проверить текущее положение указателя и посмотреть, находится ли оно в области формы. Я не уверен, доступен ли лучший вариант.

Редактировать: У нас есть похожий вопрос, который может вас заинтересовать. Как определить, находится ли мышь внутри всей формы и дочерних элементов управления в C #?

6 голосов
/ 06 января 2010

Нет хорошего способа сделать 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
                //...
            }
        }
    }
}
0 голосов
/ 08 апреля 2011

На вашем пользовательском элементе управления создайте событие указателя мыши для вашего элемента управления, как этот (или другой тип события), как этот

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

В WinForm, в котором размещен UserControl, есть это, чтобы 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 - тип пользовательского контроля

...