2011-05-05 63 views
5

當鼠標懸停在其上方時,實現UserControl的最簡單方法是模擬「熱軌」效果,在其周圍繪製邊框?Windows窗體上的「熱軌」效果UserControl

我已經失敗嘗試繼承覆蓋,吸引了邊境OnMouseHover事件自定義控件(看來,如果該事件沒有被解僱)

謝謝!

回答

2

通過在UC中使用仔細放置的面板控件,並通過監視低級別Windows消息來觀察鼠標的位置,可以模擬用戶控件周圍邊框的外觀。

在UserControl設計表面上添加一個面板並調整面板的大小,以便只有UC的一小部分設計表面可見(請參閱下面的註釋*)。設計表面的可見部分將是您的彩色邊框,因此相應地設置其「厚度」。將組成您的UC的其他控件添加到面板。

你的控制可能是這樣的:
enter image description here

實現在UC的IMessageFilter接口。在實現PreFilterMessage()時,您將檢查鼠標相對於UC的位置,並在鼠標懸停在UC上時將UC的BackColor設置爲邊框顏色,否則將其設置爲默認顏色。由於面板的BackColor不會改變,它會出現在像你的UC這樣的用戶邊界上。

下面是你需要做的代碼的最低金額:

public partial class UserControl1 : UserControl, IMessageFilter 
{ 
    public UserControl1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) { 
     if (!this.IsDisposed && this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition))) { 
      this.BackColor = Color.Green; // Or whatever border color you want. 
     } else { 
      this.BackColor = SystemColors.Control; // Back to the UC's default border color. 
     } 
     return false; 
    } 
} 

注:當我測試這個我難以得到我的面板的背景色設置爲不透明。我通過將設計器中的BackColor臨時更改爲不同的顏色,然後將其更改回默認顏色(Control)來解決此問題。

+0

謝謝!這正是我所期待的。 – Gerard 2011-05-06 13:12:29

+0

我注意到,如果在窗體上方打開一個模式窗體,PreFilterMessage仍然在下面的窗體上執行......有沒有辦法解決這個問題? – Gerard 2011-05-09 11:59:05

+0

你不需要做'Application.RemoveMessageFilter(this);'? 這是強制性的。你會如何把它放在'UserControl'中? – Odys 2012-06-22 09:23:39

0

嘗試向控件的「MouseEnter」和「MouseLeave」事件添加處理程序,該事件將更改控件的BorderStyle(如果有)。當鼠標在控件的邊界內移動時,MouseEnter會被觸發,當鼠標退出該邊框時會觸發MouseLeave。 MouseHover可能有一些額外的規則,例如鼠標必須靜止一段時間。