ダイアログボックスって普通はキーボードメッセージがこないですが、
アローキーをダイアログに貼り付けたコントロールで処理したいのです。
WM_GETDLGCODEをコントロールで受けてDLGC_WANTMESSAGEを返しているのですが、
WM_CHARやWM_KEYDOWNがコントロールに来ないです。
ダイアログはモードレスで、CreateDialogで作ってます。
コントロールはWM_INITDIALOGが来た時にCreateWindow()で作ってます。
何かいい方法はないでしょうか?
環境はWinXPとVC++6.0です。MFCは使っておりません.
質問変更します。
ダイアログのカスタムコントロールにフォーカス移すにはどうしたらよいのでしょうか?
SetFocus()じゃダメです。ボタンにフォーカス移っちゃいます。
WS_TABSTOPはつけてますが、タブでジャンプしません。
上の質問の原因はどうやらコントロールにフォーカス来てなかったからのようです。
どうやったらフォーカスを移せるのでしょうか?
ダイアログでキーボードイベントを取得して
それをカスタムコントロールに
無理やり投げるのではだめでしょうか?
お答えありがとうございます。
でも、そのダイアログ事態にキーイベントがこないんです。
困ったもんですよ・・・(最初からダイアログにしなきゃよかったんですけどね。)
あーそっか
MFCと思って答えていました。
申し訳ない。
でも、
WinMainの
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
のとこら辺りにも
はいいってこないんでしょうか?
モードレスダイアログですか.
メッセージループに IsDialogMessage の処理は入れてありますか?
お答えありがとうございます。
入れても入れなくても変わらないです。
GetMessage()の(PeekMessage()なんですけどね、本当は)メッセージループ内に」
if(msg.hwnd == hDlgWnd && msg.message == WM_KEYDOWN){
MessageBo(NULL, ", ", MB_OK);
}
という命令を入れてもメッセージボックスは出ません。
IsDialogMessage()はいれてもタブジャンプができるようになるだけですよね?
一応いれましたがカスタムコントロールにはフォーカスは移りません。
ボタンにしかフォーカスは移りません。
どうすればいいのでしょうか?
ボタンを全てなくせばカスタムコントロールにフォーカスが移るようで、
キーイベントも来るのですが・・・
今、ちょっと自作テストしてみた範囲では、何の問題も無くできました。
処理方針は、
>WM_GETDLGCODEをコントロールで受けてDLGC_WANTMESSAGEを返しているのですが、
>WS_TABSTOPはつけてますが、
と同じです。あとは特別なことは何もしてませんがTAB移動もできるし、
コントロールにWM_KEYDOWNも届きます。
ボタン間のタブ移動はできているのですか?
カスタムコントロールとは、自分でウィンドウクラスを登録したものですよね?
カスタムコントロールをCreateWindow()ではなくダイアログに直接を貼り付けてもだめです
か?
カスタムコントロールのウィンドウプロシージャでWM_SETFOCUSはどんな処理ですか?
(DefWindowProcしている?)
Spy++で見たとき、
ダイアログの直接の子になっていますか?
ウィンドウスタイルの数値はいくつになってますか?
> SetFocus()じゃダメです。ボタンにフォーカス移っちゃいます。
SetFocus() はどの場所で試しましたか?
WM_INITDIALOGだったら、その場合は FALSE を返さないとだめです。
お手数かけて申し訳ないです。
うーん、やっぱりダメです。
リソースにはりましたが動作は同じです。
WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | WS_HSCROLL
というスタイルです。
WM_SETFOCUSもDefWindowProc()にまかせてます。
Spy++でちゃんとダイアログの子だということも確認しています。
でもダメ。ボタンにしかフォーカス移らないです。
ボタン間ではちゃんと移動しています。
なぜなんでしょう、本当に。
とりあえずTAB移動はダメですがコントロールにフォーカスは移せました。
キーイベントももちろんOK。
IsDialogMessage()を処理しないようにし、
WM_COMMANDでコントロールにSetFocus()する事で常にコントロールにフォーカスが
あるようにして対処しました。
まあ、とりあえず問題なさそうなので解決とします。
みなさん、本当にありがとうございました。
・・・しかしタブジャンプでコントロールに飛べないのは謎ですね。
ボタンをサブクラス化してフォーカスを切り替えればうまくいきそうだけど・・・
めんどうだし(笑)
>WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | WS_HSCROLL
>というスタイルです。
同じスタイルで試しても、OKでした。
これまでに提示された情報の範囲では、私の知恵では原因が思い浮かびません。
私が試してみたのと同様、最小コードのサンプルを作って試してみるのがいいと思います。
で、
うまくいくようなら、違いを探す。
うまくいかなければ、最小コードのサンプルのほうを提示してみる。