2

と があるUserControlTreeViewありTabControlます。このユーザー コントロールは、通常の形式でホストされています。

ユーザーがツリービューから何かを選択すると、カスタム ピクチャ ボックスがタブ コントロールのタブページに追加されます。このピクチャーボックスのキーを処理したいのですが、カスタムピクチャーボックス内で作成したイベントが呼び出されません。私が望むのは矢印キーを処理することですが、フォーカスはツリービューにとどまるため、矢印キーはツリービューで発生します。

ユーザーがクリックしたときにピクチャボックスにフォーカスを与えるようにコードを追加しましたが、ツリービューからフォーカスを削除するのには役立ちません。custompicturebox コントロールのコードの一部を次に示します。

更新 矢印キーのような特別なキーだけが機能していないようです。私の推測では、ツリービューによって矢印キーが登録されているためです。KeyDownピクチャーボックスのイベントを文字キーを使用するように変更すると、うまくいきます!

private void IcPackageViewBox_KeyDown(object sender, KeyEventArgs e)
{
    if(e.KeyCode == Keys.Right)
    {
        OnPinClicked(_pinMap[_pinRectIndex].Pin);

        if (_pinRectIndex < _pinMap.Count)
            _pinRectIndex++;
        else
            _pinRectIndex = 0;
    }
}
    //Mouse Down Event
private void PackageViewBox_MouseDown(object sender, MouseEventArgs e)
{
    Focus();
    BringToFront(); //bring to front works! maybe it means focus should work also?
 }

この UserControl をホストするフォームには、KeyPreview設定Trueがありますが、このフォームの他のイベントも設定する必要があります。たぶんこれが、カスタムコントロール内でキープレスを取得できない理由ですか?

    private void MainForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Modifiers == Keys.Control)
        {
            projectBrowser.ControlKeyIsDown = true;
            e.Handled = true;
        } 
     }

    private void MainForm_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.LControlKey || e.KeyCode == Keys.RControlKey || e.KeyCode == Keys.ControlKey || e.KeyCode == Keys.Control)
        {
            projectBrowser.ControlKeyIsDown = false;
            e.Handled = true;
        }
    }

プログラムは次のようになります。 ここに画像の説明を入力

4

1 に答える 1

0

これを処理する1つの方法は、フォームのProcessCmdKeyメソッドをオーバーライドすることです。そこで、ターゲットコントロール(フォーカスのあるコントロール)にディスパッチされる前に、WM_KEYDOWNメッセージを受け取ります。そこで、キーストロークを処理するための独自のロジックを実行し、メッセージのそれ以上の処理を許可または禁止することができます。

于 2012-08-28T16:01:52.757 に答える