ダイアログバー内エディットボックスのキー入力

[戻る]
Peng 2006/07/24(月) 10:45:57
CMainFrameにエディットボックス付きのダイアログバーを持たせているのですが、
アクセラレータキーにVK_RIGHTやVK_LEFTやVK_SPACEなどの単体の動作を登録してあるため、
エディットボックス上でカーソル移動や文字入力をすることができず、
ビューのコマンドが動いてしまいます。
エディットボックス上の標準キー操作を優先させるには、
どのように対処すればよいのでしょうか?

Kerry 2006/07/24(月) 11:51:55
ダイアログバーの派生クラスを作って、PreTranslateMessage関数を
以下のようにオーバーライドすれば可能です。

BOOL CMyDialogBar::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
    {
        if (IsDialogMessage(pMsg))
            return TRUE;
    }
    return CDialogBar::PreTranslateMessage(pMsg);
}

Peng 2006/07/24(月) 16:55:12
ありがとうございます。

ダイアログバーは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派生クラスを作って置き換えてしまうしかないのでしょうか?

Kerry 2006/07/24(月) 19:01:52
IsDialogMessageは、関係無いメッセージは処理せず
FALSEを返したと思いますので、おそらく、それでも
問題なく動くと思います。

Peng 2006/07/24(月) 19:13:16
[[解決]]
なるほど、IsDialogMessageは
そのダイアログバー内のコントロールがどれもフォーカスを持っていなければ、
WM_KEY関連のメッセージは無視してくれるのですね。
上の記述だと無理やりメッセージを送りつけているような感じがしていたので、
そうなっていないことがわかって安心しました。
ありがとうございました。

古いスレッドには追加発言できません。