コントロールがマウスの上にある場合にのみ無効にする必要があります。マウスの位置は、静的な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();
私はmouseOverイベントを使用する必要がありますか?しかし、もしマウスが私のコントロールを離れたとき(デフォルトの境界線を描くために)どうすればいいでしょうか? – tron
"マウスが上にある場合にのみコントロールを無効にする必要があります。"それはここで私には意味をなさない。マウスオーバー状態が変更されたとき(イン>アウトまたはアウト>イン)にのみ無効にするべきではありませんか? – Justin
@トロン:申し訳ありませんが、私はあなたがそれをどう扱うかを知っていたと思っていました。 ;)私はそれを含めるために私の答えを更新します。 –