0

MDI アプリケーションの CWinFormsView V内に WinForms コントロール ( Cとしましょう) があります。CはOnKeyDownメソッドをオーバーライドします。CでOnMouseUpもオーバーライドし、そこでFocus()メソッドを呼び出すので、 C内をクリックするとキーボード メッセージが直接表示され、すべてが正しく機能します。

ただし、ビュー内をクリックすることなく、Vに切り替えるときにキーボードを使用してCを制御できるようにしたいと考えています。どうすればそれを達成できますか?VでWM_KEYDOWN メッセージをキャッチし、ホストされたコントロール (つまり、C ) に手動で渡す必要がありますか? Cは実際にはVの子ウィンドウですが、何らかの形で自動的に動作するはずではありませんか?

4

2 に答える 2

0

あなたの質問に従った場合、最も簡単な方法は、V にプレスを C に転送させることです。

Form.KeyPreviewV を見てください。これにより、V は、それまたはその子の 1 つにフォーカスがあるときに、すべてのキーが押されたことを認識できます。その後、C に転送できます。

于 2011-05-17T18:07:08.230 に答える
0

Vビューで次のコードを使用して実際に問題を解決しました。

BOOL CMyView::PreTranslateMessage(MSG* pMsg)
{
    if( pMsg->message == WM_KEYDOWN || pMsg->message == WM_MOUSEWHEEL )
    {
        ::SendMessage( (HWND) m_myControl->Handle.ToInt32(), pMsg->message, pMsg->wParam, pMsg->lParam );
    }

    return CWinFormsView::PreTranslateMessage(pMsg);
}

また、マウス クリックでフォーカスをCに設定するコードを削除しました。このようにして、フォーカスされることはありませんが、 PreTranslateMessage から親ビューのメッセージ (WM_KEYDOWN と WM_MOUSEWHEEL が必要です) を受け取ります。そうしないと、Ctrl + Tabを使用してMDIビューを切り替えることができなくなるため(Cがフォーカスされている場合)、フォーカスを設定しないことが重要です。これで、それらを自由に切り替えることができ、Vがアクティブになると、キーを使用してCを制御できますが、マウスを使用せずに Ctrl+Tab を使用して別のビューに切り替えることができます。

于 2011-05-18T09:28:50.587 に答える