MFCダイアログ応答OnChar()

2071 ワード


最近、プログラムを書く時に、ダイアログボックスでキーボードメッセージを受信しない場合があり、特に以下の内容を検索しました.
MFCのダイアログボックスはOnCharとOnKeyDownメッセージに直接応答しないので、他のコントロールにブロックされ、テスト時にこの2つの関数には入らないことがわかりました.PreTranslateMessage()虚関数を再定義しなければなりません.
この2つのメッセージ関数に入ります.具体的には、次のようになります.
 
   BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
    {
        SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
        return 0;
        //return CDialog::PreTranslateMessage(pMsg);
    }

 
これにより、onKeyDownとonCharの2つの関数を正しく呼び出すことができ、onKeyDown()はonCchar()の前に処理されます.これにより、ダイアログボックスでWM_に応答できます.CHAR、WM_KEYDOWMメッセージを送信しました.注意してWM_を送信します.CHARでは、実際に3つのメッセージが送信されました
すなわちWM_CHAR     WM_KEYDOWM     WM_KEYUP
次のコードがあれば
 
void CMy1Dlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
 {
  // TODO: Add your message handler code here and/or call default
  if(nChar=='a')
   MessageBox("a");
  CDialog::OnChar(nChar, nRepCnt, nFlags);
 }

 
2つのメッセージダイアログが表示されるので、WM_で単独で行うのが望ましいです.KEYDOWMまたはWM_KEYUPがイベントを処理する.
PreTranslateMessageはTranslateMessage関数にメッセージを送る前に呼び出されます.ほとんどのこのウィンドウのメッセージはここを通って、よく使われています.MFCの前にメッセージを処理する必要がある場合は、よく
ここにコードを追加します.MFCメッセージ制御フローの最も特徴的な点はCWndクラスの仮想関数PreTranslateMessage()であり、この関数を再ロードすることで、MFCのメッセージ制御プロセスを変更することができ、さらには
新しい制御が流れ出る.メッセージキューを通過するメッセージのみがPreTranslateMessage()の影響を受け、SendMessage()または他の類似の方法でウィンドウに直接送信され、メッセージキューを通過しないメッセージはまったくありません.
PreTranslateMessage()の存在を無視します.
一、TranslateMessage()とDispatchMessage()を呼び出すかどうかは、PreTranslateMessage()という名前の関数の戻り値によって決定され、その関数がTRUEに戻ると、メッセージは分割されない
ウィンドウ関数処理に送信します.
二、PreTranslateMessage()に伝達されるメッセージは翻訳されていないメッセージであり、TranslateMessage()処理されていない.この関数では(pMsg->wParam=VK_RETURN)を使用してブロックできます
スイッチを切る.