2011-01-15 25 views
4

MFC(VS2008)でダイアログベースのプロジェクトを作成し、OnKeyDownイベントをダイアログに追加するだけです。 プロジェクトを実行してキーボードのキーを押すと、何も起こりません。しかし、ダイアログからすべてのコントロールを削除し、プロジェクトを再実行すると機能します。 ダイアログにコントロールがある場合でもキーイベントを取得するにはどうすればよいですか?ダイアログがそれのコントロールを持っている場合は、ダイアログ自体がフォーカスを取得したことがないなぜOnKeyDownは、ダイアログベースのMFCプロジェクトでキーイベントをキャッチしませんか?

void CgDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{ 
    // TODO: Add your message handler code here and/or call default 
    AfxMessageBox(L"Key down!"); 
    CDialog::OnKeyDown(nChar, nRepCnt, nFlags); 
} 

答えて

16

は、ここでコードの一部です。子供のコントロールによって盗まれました。ボタンを押すと、CgDlg::OnKeyDownが呼び出されないように、メッセージがフォーカスのあるコントロールに送信されます。あなたはダイアログがWM_KEYDOWNメッセージを処理したい場合は、ダイアログのPreTranslateMessage関数をオーバーライドします:

BOOL CgDlg::PreTranslateMessage(MSG* pMsg) 
{ 
    if(pMsg->message == WM_KEYDOWN ) 
    { 
     if(pMsg->wParam == VK_DOWN) 
     { 
     ... 
     } 
     else if(pMsg->wParam == ...) 
     { 
     ...      
     } 
     ... 
     else 
     { 
     ...     
     } 
    } 

    return CDialog::PreTranslateMessage(pMsg); 
} 

はまたCodeProjectの上で、この記事を参照してください。http://www.codeproject.com/KB/dialog/pretransdialog01.aspx私はCDialogのアプリの

+0

ダイアログに 'CMFCPropertyGridCtrl'を追加し、その' OnKeyDown'メソッドが呼び出されていません。 – manatttta

0

多くはは、OnKeyDown()を使用します。ゲームのように、キーを押して画面に描画したい場合は、既定のボタンと静的テキスト(CDialogは空でなければなりません)を削除し、OnKeyDown()が機能し始めます。コントロールがCDialogに配置されると、OnKeyDown()は呼び出されなくなります。

関連する問題