只有鼠標懸停時,您才應該使控件失效。您可以通過檢查所有控件可用的靜態MousePosition
變量來檢查鼠標的位置。只需添加一個檢查條件使您的控件失效。
執行此操作的最簡單方法是從MouseEnter
和MouseLeave
事件中執行這些檢查,然後適當地使其無效。
protected override void OnMouseEnter(EventArgs e)
{
var mousePos = this.PointToClient(MousePosition);
if (this.ClientRectangle.Contains(mousePos))
{
this.Invalidate(invalidateChildren: true);
}
base.OnMouseEnter(e);
}
protected override void OnMouseLeave(EventArgs e)
{
var mousePos = this.PointToClient(MousePosition);
if (!this.ClientRectangle.Contains(mousePos))
{
this.Invalidate(invalidateChildren: true);
}
base.OnMouseLeave(e);
}
對於一個更強大的方式來處理這個問題,你需要確定鼠標是否真正進入或離開你的控制。您需要保留兩個變量來保持狀態,一個用於確定鼠標是否處於您的控制之下,另一個用於確定鼠標是否超出了您的控制範圍(自上次檢查以來)。如果這些不同,則使控制無效。您將獲得額外的獎勵,以瞭解鼠標是否超出了您的控制範圍,以便您可以有條件地在繪畫方法中執行一些操作。
private bool wasMouseOver;
private bool isMouseOver;
public bool IsMouseOver { get { return isMouseOver; } }
private void CheckMousePosition()
{
var mousePos = this.PointToClient(MousePosition);
wasMouseOver = isMouseOver;
isMouseOver = this.ClientRectangle.Contains(mousePos);
if (isMouseOver != wasMouseOver)
this.Invalidate(invalidateChildren: true);
}
// then register this method to the mouse events
EventHandler mouseHandler = (sender, e) => CheckMousePosition();
MouseEnter += mouseHandler;
MouseLeave += mouseHandler;
MouseMove += (sender, e) => CheckMousePosition();
所以我應該使用mouseOver事件?但是,如果/當鼠標離開我的控制(繪製默認邊框)時,我將如何識別? – tron 2011-04-27 19:31:53
「只有鼠標懸停時,您才應該使控件失效。」這在我這裏沒有意義。不應該只在鼠標懸停狀態發生變化時(in - > out或out - > in)失效? – Justin 2011-04-27 19:34:11
@tron:對不起,我不知道該怎麼處理。 ;)我會更新我的答案,包括這一點。 – 2011-04-27 19:35:43