2008-12-07 168 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