ボタンのような動作をするカスタム コントロールを作成しています。ユーザーはクリック イベントを処理できる必要があり、コントロールは押されたことを視覚的に知らせる必要があります。OnMouseDown メソッドでコントロールの表示状態を変更し、OnMouseUp で元に戻すと、完全に機能します。ただし、テスト中に、コントロールが常にマウス クリック メッセージを受信するとは限らないことに気付きましたが、デバイスはクリックに対して適切な聴覚信号を生成しており、コントロールはフォーカスを失っていません。
PS誰かが私のアプリに送信されたWindowsメッセージをログに記録できる優れたユーティリティを知っていれば、それはうねり、何が問題なのかを知るのに役立つかもしれません。
ここに私が持っているものの非常に単純化されたバージョンがあります
public class CustomButton : UserControl
{
private bool _isMouseDown = false;//flag tells PaintBorder what state to draw
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
PaintBackground(e);
PaintBorder(e, _isMouseDown);
}
protected override void OnGotFocus(EventArgs e)
{
this.Invalidate();
base.OnGotFocus(e);
}
protected override void OnTextChanged(EventArgs e)
{
this.Invalidate();
base.OnTextChanged(e);
}
protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_isMouseDown = true;
if (!this.Focused)
{
this.Focus();
}
else //getting focus causes Invalidate, no need to call twice
{
this.Invalidate();
}
}
base.OnMouseDown(e);
}
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
if (_isMouseDown)
{
_isMouseDown = false;
this.Invalidate();
}
base.OnMouseUp(e);
}
}