2011-04-27 6 views
0

こんにちは OnPaintメソッドをオーバーライドして色の境界線を描画するカスタムコントロールがあります。しかし、マウスがコントロールの領域に入ると、マウスがコントロールを離れる場合、私のコントロールの境界線の色を変更したいと思います。最初はイベントmouseLeaveとmouseEnterに反応し、コントロールボーダーを適切な色で再描画したいと思っていました。しかし、私のコントロールでは、いくつかのテキストボックス、ラベルなど - イベントmouseEnterとmouseLeave非常に多くの時間を起動し、これは(多くの再描画のために)私のコントロールが点滅する原因になります。有効な方法でコントロールの境界線を描画する方法

適切な瞬間を見つけてコントロールを再描画する方法はありますか?mouseLeaveとmouseEnterで反応しますか?

答えて

2

コントロールがマウスの上にある場合にのみ無効にする必要があります。マウスの位置は、静的な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); 
} 

これを処理するより堅牢な方法として、実際にマウスがコントロールに入るかどうかを判断する必要があります。状態を保持するには2つの変数を保持する必要があります.1つは現在マウスがあなたのコントロールの上にあるかどうかを知らせる変数、もう1つはマウスがあなたのコントロールの上にあるかどうかを確認する変数です。これらが異なる場合は、コントロールを無効にします。条件付きでペイントメソッドでいくつかの操作を実行できるように、マウスがコントロール上にあるかどうかを知るという追加のボーナスが得られます。

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(); 
+0

私はmouseOverイベントを使用する必要がありますか?しかし、もしマウスが私のコントロールを離れたとき(デフォルトの境界線を描くために)どうすればいいでしょうか? – tron

+0

"マウスが上にある場合にのみコントロールを無効にする必要があります。"それはここで私には意味をなさない。マウスオーバー状態が変更されたとき(イン>アウトまたはアウト>イン)にのみ無効にするべきではありませんか? – Justin

+0

@トロン:申し訳ありませんが、私はあなたがそれをどう扱うかを知っていたと思っていました。 ;)私はそれを含めるために私の答えを更新します。 –

関連する問題