ダイアログバー内エディットボックスのキー入力 – プログラミング – Home

ダイアログバー内エディットボックスのキ...
 
通知
すべてクリア

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


Peng
 Peng
(@Peng)
ゲスト
結合: 18年前
投稿: 17
Topic starter  

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


引用未解決
トピックタグ
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

ダイアログバーの派生クラスを作って、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
 Peng
(@Peng)
ゲスト
結合: 18年前
投稿: 17
Topic starter  

ありがとうございます。

ダイアログバーは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
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

IsDialogMessageは、関係無いメッセージは処理せず
FALSEを返したと思いますので、おそらく、それでも
問題なく動くと思います。


返信引用
Peng
 Peng
(@Peng)
ゲスト
結合: 18年前
投稿: 17
Topic starter  

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました