0

PictureBoxコントロールから派生したカスタム コントロールがあります。そのためのKeyDownイベントを書きたいのですが、以下のコードを書きましたが、まだ使用できません。以下のコードを確認して、何か間違っているか、追加が必要かどうか教えてください。デフォルトではPictureBoxのKeyDownイベントがないことを知っているので、KeyDownイベントを使用してカスタムの選択可能なPictureBoxを作成しようとしています...

    using System;
    using System.Linq;
    using System.Windows.Forms;

    namespace BenisImageDownloader
    {
        class SelectablePictureBox:PictureBox
        {
            public SelectablePictureBox()
            {
                this.SetStyle(ControlStyles.Selectable, true);
                this.TabStop = true;
            }

            protected override void OnMouseDown(MouseEventArgs e)
            {
                this.Focus();
                base.OnMouseDown(e);
            }

            protected override void OnKeyDown(KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
                    e.Handled = true;
                base.OnKeyDown(e);
            }

            protected override bool IsInputKey(Keys keyData)
            {
                if (keyData == Keys.Up || keyData == Keys.Down) return true;
                if (keyData == Keys.Left || keyData == Keys.Right) return true;
                return base.IsInputKey(keyData);
            }

            protected override void OnEnter(EventArgs e)
            {
                this.Invalidate();
                base.OnEnter(e);
            }

            protected override void OnLeave(EventArgs e)
            {
                this.Invalidate();
                base.OnLeave(e);
            }

            protected override void OnPaint(PaintEventArgs pe)
            {
                base.OnPaint(pe);
                if (this.Focused)
                {
                    var rc = this.ClientRectangle;
                    rc.Inflate(-2, -2);
                    ControlPaint.DrawFocusRectangle(pe.Graphics, rc);
                }
            }
        }
    }

私は、論文を提出するために Windows Form Application v4.0 プロジェクト (WPF ではない) に取り組んでいる学生です。

4

1 に答える 1

1

代わりに、コントロールのProcessCmdKey() 関数をオーバーライドして、そこでキーの押下をキャプチャできます。

(申し訳ありませんが、私は VB の例しか持っていません - しかし、あなたはアイデアを得るでしょう):

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message,
                                           ByVal keyData As System.Windows.Forms.Keys) As Boolean

    'process key, return true for processed
    If (keyData And Keys.KeyCode) = Keys.KeyToCheck Then
        Return true
    End If

    Return MyBase.ProcessCmdKey(msg, keyData)

End Function
于 2012-11-17T09:57:20.780 に答える