Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MouseEnter and MouseLeave events from a Panel and its child controls

I have a Panel that contains child controls.

If I handle the Panel's MouseEnter and MouseLeave events, and its child's MouseEnter and MouseLeave events, the events are raised in this order:

Panel.MouseEnter
Panel.MouseLeave
Child1.MouseEnter
Child1.MouseLeave
Panel.MouseEnter
Panel.MouseLeave

But I need the following order:

Panel.MouseEnter
Child1.MouseEnter
Child1.MouseLeave
Panel.MouseLeave

Is that possible?

like image 831
DxCK Avatar asked Apr 04 '10 21:04

DxCK


2 Answers

If you dont mind creating a usercontrol(derived from the panel or other parent container you wish), Override your parent's OnMouseLeave method to look like the following..

protected override void OnMouseLeave(EventArgs e)
{

    if(this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
         return;
    else
    {
        base.OnMouseLeave(e);
    }
}

Then, the event raising will be in the required order.

like image 104
Mat J Avatar answered Oct 31 '22 11:10

Mat J


The mouse is "leaving" the panel as it enters the child control which is why it fires the event.

You could add something along the following lines in the panel MouseLeave event handler:

// Check if really leaving the panel
if (Cursor.Position.X < Location.X ||
    Cursor.Position.Y < Location.Y ||
    Cursor.Position.X > Location.X + Width - 1 ||
    Cursor.Position.Y > Location.Y + Height - 1)
{
    // Do the panel mouse leave code
}
like image 5
ChrisF Avatar answered Oct 31 '22 13:10

ChrisF