0

Form.ProcessDialogKey現在、WinForms フォーム内のメソッドをオーバーライドして、ユーザーがAlt+ 1... Alt+を押したときにフォーム内のタブ コントロールのタブ ページを直接選択できるようにしています9

Altつまり、 +を押す1と最初のタブが選択され、Alt+ 22 番目のタブが選択されます。

これは私のコードの抜粋です:

protected override bool ProcessDialogKey(Keys keyData)
{
    if ((e.KeyData & Keys.Alt) == Keys.Alt)
    {
       if ((e.KeyData & Keys.D1) == Keys.D1) tabIndex = 0;
       else if ((e.KeyData & Keys.D1) == Keys.D1) tabIndex = 0;
       else if ((e.KeyData & Keys.D2) == Keys.D2) tabIndex = 1;
       else if ((e.KeyData & Keys.D3) == Keys.D3) tabIndex = 2;
       // ...
    }
}

私のチェックが冗長な結果をもたらすことを発見しました。Altたとえば、 +を押すと3

(e.KeyData & Keys.D3) == Keys.D3 // <<== TRUE.

ですがtrue、他のチェックも次のtrueとおりです。

(e.KeyData & Keys.D1) == Keys.D1 // <<== also TRUE.
(e.KeyData & Keys.D0) == Keys.D0 // <<== also TRUE.

Keys列挙Keysは他のメンバー値のビットごとの組み合わせを多く行うため、これは非常に論理的だと思います。

だから私は unsertand を行い、なぜあまりにも多くのtrue結果が得られるのか、正しいチェックを行う方法がわかりません。

私の質問:

Form.ProcessDialogKeyこのメソッドを使用してAlt+ 1... Alt+9の組み合わせを確認できますか、それとも別のアプローチを選択する必要がありますか?

(別のアプローチがある場合は、それへのリンクを取得したいと思います)

更新 1:

チェックの順序を逆にすると、つまり、最初Keys.D9に、次にそれまでKeys.D1のマッチングがうまくいくようです (正しいですか?)

4

1 に答える 1

3

ここで & 演算子を使用するのは正しくありません。Keys 列挙には [Flags] 属性がありますが、これはフラグと値の組み合わせです。必然的に、int または long にはビットよりも多くのキーが存在します。一部のビットは Keys.Alt のように修飾子を示しますが、下位 16 ビットはキー コードであり、比較するには == 演算子を使用する必要があります。

DRY に保つには、次のコードを検討してください。

    protected override bool ProcessDialogKey(Keys keyData) {
        if (keyData >= (Keys.Alt | Keys.D1) && keyData <= (Keys.Alt | Keys.D9)) {
            int cmd = (keyData & Keys.KeyCode) - Keys.D0;
            // etc...
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }
于 2012-08-25T14:35:36.843 に答える