2008-12-07 96 views
4

我有一个Panel控件的mouseenter和mouseleave事件,它在鼠标进入时更改背景色,并在离开时返回到白色。C#窗体中的自定义控件Windows窗体鼠标事件问题

我在此面板中也有Label控件,但是当鼠标进入Label控件时,面板的mouseleave事件会触发。

这是有道理的,但是如果鼠标在其区域内时没有其他控件影响它,该如何保持面板的背景颜色相同?

回答

4

您可以使用GetChildAtPoint()来确定鼠标是否在子控件上。

private void panel1_MouseLeave(object sender, EventArgs e) 
{ 
    if (panel1.GetChildAtPoint(panel1.PointToClient(MousePosition)) == null) 
    { 
     panel1.BackColor = Color.Gray; 
    } 
} 

如果控制实际上不是一个子控件,您仍然可以使用MousePosition和PointToScreen以确定是否鼠标仍然在控制的范围之内。

private void panel1_MouseLeave(object sender, EventArgs e) 
{ 
    Rectangle screenBounds = new Rectangle(this.PointToScreen(panel1.Location), panel1.Size); 
    if (!screenBounds.Contains(MousePosition)) 
    { 
     panel1.BackColor = Color.Gray; 
    } 
} 
0

您可以为标签添加一个MouseEnter事件,该事件还可以设置面板的背景颜色。您不需要标签的MouseLeave事件。

或者:

  1. 设置MouseEnter事件的面板设置面板的背景色。
  2. 设置面板的父控件(例如Form)MouseEnter事件来重置面板的背景色。

如果你想要做点2以上而不触及父控件的代码(根据其他用户的评论),你可以做这样的事情在小组ParentChanged事件:

private void panel1_ParentChanged(object sender, EventArgs e) 
    { 
     Panel thisPanel = sender as Panel; 

     if(thisPanel != null && thisPanel.Parent != null) 
     { 
      thisPanel.Parent.MouseEnter += delegate(object senderObj, EventArgs eArgs) { thisPanel.BackColor = SystemColors.Control; }; 
     } 
    } 
1

为包含的控件添加事件意味着,当您想要将另一个控件添加到面板时,您也必须通过相同的练习。

为父控件添加一个事件意味着只要您希望在其他地方使用该面板,就必须对新父项执行相同的操作。当面板的需求发生变化时,您必须记住将处理从父控件的事件中移出。

所有潜在的麻烦进一步下行。

我倾向于在面板的鼠标离开事件中放置一些坐标检查,并且只有在鼠标已经超出面板边界时才重置面板颜色。

这样,面板处理的代码只保留在有问题的面板上。

1

我找到了一个简单的解决方案。我只是将标签上的enabled属性设置为false,并没有问题。

+3

...它会没事,直到你想在你的面板上启用控制:) – ChrisA 2008-12-07 15:01:03