當鼠標懸停在其上方時,實現UserControl的最簡單方法是模擬「熱軌」效果,在其周圍繪製邊框?Windows窗體上的「熱軌」效果UserControl
我已經失敗嘗試繼承覆蓋,吸引了邊境OnMouseHover事件自定義控件(看來,如果該事件沒有被解僱)
謝謝!
當鼠標懸停在其上方時,實現UserControl的最簡單方法是模擬「熱軌」效果,在其周圍繪製邊框?Windows窗體上的「熱軌」效果UserControl
我已經失敗嘗試繼承覆蓋,吸引了邊境OnMouseHover事件自定義控件(看來,如果該事件沒有被解僱)
謝謝!
通過在UC中使用仔細放置的面板控件,並通過監視低級別Windows消息來觀察鼠標的位置,可以模擬用戶控件周圍邊框的外觀。
在UserControl設計表面上添加一個面板並調整面板的大小,以便只有UC的一小部分設計表面可見(請參閱下面的註釋*)。設計表面的可見部分將是您的彩色邊框,因此相應地設置其「厚度」。將組成您的UC的其他控件添加到面板。
你的控制可能是這樣的:
實現在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)來解決此問題。
嘗試向控件的「MouseEnter」和「MouseLeave」事件添加處理程序,該事件將更改控件的BorderStyle(如果有)。當鼠標在控件的邊界內移動時,MouseEnter會被觸發,當鼠標退出該邊框時會觸發MouseLeave。 MouseHover可能有一些額外的規則,例如鼠標必須靜止一段時間。
謝謝!這正是我所期待的。 – Gerard 2011-05-06 13:12:29
我注意到,如果在窗體上方打開一個模式窗體,PreFilterMessage仍然在下面的窗體上執行......有沒有辦法解決這個問題? – Gerard 2011-05-09 11:59:05
你不需要做'Application.RemoveMessageFilter(this);'? 這是強制性的。你會如何把它放在'UserControl'中? – Odys 2012-06-22 09:23:39