こんにちは、ぐ です。
5/8の質問の続きになってしまうのですが・・
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200404/04040051.txt
2画面でCTRLキーを取得したいと思っていますが、
画面2でCTRL+Oする(「ファイルを開く」画面を出したい)と
画面1が前面に来て、「ファイルを開く」画面が出てしまいます。
状況は以下の通りです
画面1(ウィンドウ(CFormView))
・メニューID :IDR_GAMEN1
・アクセラレータID:IDR_GAMEN1(アクセラレータにCTRL+Oがある)
画面2(ダイアログ(CDialog))
・画面2は画面1から生成されるダイアログ
・ダイアログのプロパティでメニューを設定している
・メニューID :IDR_GAMEN2
・アクセラレータID:IDR_GAMEN2(アクセラレータにCTRL+Oはない)
画面2のOnInitDialog()で
m_hPulseDispAccel = ::LoadAccelerators( AfxGetInstanceHandle( ),
MAKEINTRESOURCE(IDR_GAMEN2));
画面2のPreTranslateMessage()で
if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
return m_hPulseDispAccel != NULL &&
::TranslateAccelerator(this->m_hWnd,
this->m_hPulseDispAccel, pMsg);
としています。
LoadAcceleratorsでIDR_GAMEN2を指定しているので、そちらのアクセラレータが
使用されるのだろうと思っていたら、画面1のアクセラレータが使用されているように見えます。
(画面2のアクセラレータにはCTRL+Oはないはずなのに・・)
環境はWindowsXP ,VC++6.0(MFC使用)です。
どなたか、方法を教えてください。よろしくお願いいたします。
PreTranslateMessage()はFALSEを返す限り、
親ウィンドウに遡ってどんどん呼び出されます。
> if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
> return m_hPulseDispAccel != NULL &&
> ::TranslateAccelerator(this->m_hWnd,
> this->m_hPulseDispAccel, pMsg);
これだとダイアログの本来のPreTranslateMessage()が処理されないですね。
こんな風にしてみてはいかがでしょう。
if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) {
if (アクセラレーターの処理がなされた) {
return TRUE;
}
}
// ダイアログはキー操作を処理します。
return CDialog::PreTranslateMessage(pMsg);
> PreTranslateMessage()はFALSEを返す限り、
> 親ウィンドウに遡ってどんどん呼び出されます。
そうなんですか・・。知りませんでした・・・
if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
{
if ( m_hPulseDispAccel != NULL &&
::TranslateAccelerator(this->m_hWnd,this->m_hPulseDispAccel, pMsg))
{
return TRUE;
}
}
と、してみたら出来ました。
dairygoodsさん、ありがとうございました!