7

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

コードは次のとおりです。

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);
}
4

2 に答える 2

21

ダイアログにコントロールがある場合、ダイアログ自体がフォーカスを取得することはありません。子コントロールに盗まれました。ボタンを押すと、WM_KEYDOWNフォーカスのあるメッセージがコントロールに送信されるため、CgDlg::OnKeyDown呼び出されることはありません。ダイアログでメッセージPreTranslateMessageを処理する場合は、ダイアログの機能をオーバーライドします。WM_KEYDOWN

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

于 2011-01-15T11:06:23.530 に答える
0

私の CDialog アプリの多くは OnKeyDown() を使用しています。(ゲームを作成する場合のように) キーの押下と画面への描画のみを受け取りたい場合は、既定のボタンと静的テキスト (CDialog を空にする必要があります) を削除すると、OnKeyDown() が機能し始めます。コントロールが CDialog に配置されると、OnKeyDown() は呼び出されなくなります。

于 2011-09-23T16:38:31.490 に答える