CMainFrameにエディットボックス付きのダイアログバーを持たせているのですが、
アクセラレータキーにVK_RIGHTやVK_LEFTやVK_SPACEなどの単体の動作を登録してあるため、
エディットボックス上でカーソル移動や文字入力をすることができず、
ビューのコマンドが動いてしまいます。
エディットボックス上の標準キー操作を優先させるには、
どのように対処すればよいのでしょうか?
ダイアログバーの派生クラスを作って、PreTranslateMessage関数を
以下のようにオーバーライドすれば可能です。
BOOL CMyDialogBar::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
{
if (IsDialogMessage(pMsg))
return TRUE;
}
return CDialogBar::PreTranslateMessage(pMsg);
}
ありがとうございます。
ダイアログバーはCDialogBarをそのまま使っているため、
ためしにCMainFrame::PreTranslateMessageで
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
{
if (m_wndDlgBar1.IsDialogMessage(pMsg))
{
return TRUE;
}
if (m_wndDlgBar2.IsDialogMessage(pMsg))
{
return TRUE;
}
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
とやってみてもうまく動いているような感じなのですが、
この方法だと構造的になにかまずいことになりますでしょうか?
ダイアログバーがフォーカスを持っていないときに
IsDialogMessageに渡しちゃまずいのかなと思っていたのですが、
そのような常態でも変な動きはしていないようなのですが。
それともやはり、PreTranslateMessageだけを用意した
CDialogBar派生クラスを作って置き換えてしまうしかないのでしょうか?
IsDialogMessageは、関係無いメッセージは処理せず
FALSEを返したと思いますので、おそらく、それでも
問題なく動くと思います。
なるほど、IsDialogMessageは
そのダイアログバー内のコントロールがどれもフォーカスを持っていなければ、
WM_KEY関連のメッセージは無視してくれるのですね。
上の記述だと無理やりメッセージを送りつけているような感じがしていたので、
そうなっていないことがわかって安心しました。
ありがとうございました。