1

ボタンのような動作をするカスタム コントロールを作成しています。ユーザーはクリック イベントを処理できる必要があり、コントロールは押されたことを視覚的に知らせる必要があります。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);
    }
}
4

1 に答える 1

0

Compact Framework のボタン コントロールにも同様の問題がありました。

ボタンをすばやくクリックすると、一部Clickの が になることがDoubleClickわかりました。

このコードは私の問題を修正しました:

protected override void OnDoubleClick(EventArgs e)
{
    base.OnClick(e);
}

このコードDoubleClickを挿入すると機能しなくなることに注意してください。

于 2013-09-09T05:00:37.127 に答える