ダイアログでキー入力メッセージを受けたい

[戻る]
SunPac 2003/10/29(水) 11:52:49
ダイアログボックスって普通はキーボードメッセージがこないですが、
アローキーをダイアログに貼り付けたコントロールで処理したいのです。
WM_GETDLGCODEをコントロールで受けてDLGC_WANTMESSAGEを返しているのですが、
WM_CHARやWM_KEYDOWNがコントロールに来ないです。
ダイアログはモードレスで、CreateDialogで作ってます。
コントロールはWM_INITDIALOGが来た時にCreateWindow()で作ってます。
何かいい方法はないでしょうか?
環境はWinXPとVC++6.0です。MFCは使っておりません.

SunPac 2003/10/29(水) 14:52:34
質問変更します。

ダイアログのカスタムコントロールにフォーカス移すにはどうしたらよいのでしょうか?
SetFocus()じゃダメです。ボタンにフォーカス移っちゃいます。
WS_TABSTOPはつけてますが、タブでジャンプしません。
上の質問の原因はどうやらコントロールにフォーカス来てなかったからのようです。
どうやったらフォーカスを移せるのでしょうか?

tipe 2003/10/29(水) 15:16:05
ダイアログでキーボードイベントを取得して
それをカスタムコントロールに
無理やり投げるのではだめでしょうか?

SunPac 2003/10/29(水) 15:23:56
お答えありがとうございます。
でも、そのダイアログ事態にキーイベントがこないんです。
困ったもんですよ・・・(最初からダイアログにしなきゃよかったんですけどね。)

tipe 2003/10/29(水) 15:51:23
あーそっか
MFCと思って答えていました。
申し訳ない。
でも、
WinMainの
while (GetMessage(&msg, NULL, 0, 0)) {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
のとこら辺りにも
はいいってこないんでしょうか?

ちぇっく 2003/10/29(水) 15:58:28
モードレスダイアログですか.
メッセージループに IsDialogMessage の処理は入れてありますか?

SunPac 2003/10/29(水) 16:37:03
お答えありがとうございます。
入れても入れなくても変わらないです。
GetMessage()の(PeekMessage()なんですけどね、本当は)メッセージループ内に」

if(msg.hwnd == hDlgWnd && msg.message == WM_KEYDOWN){
   MessageBo(NULL, "", "", MB_OK);
}

という命令を入れてもメッセージボックスは出ません。
IsDialogMessage()はいれてもタブジャンプができるようになるだけですよね?
一応いれましたがカスタムコントロールにはフォーカスは移りません。
ボタンにしかフォーカスは移りません。
どうすればいいのでしょうか?
ボタンを全てなくせばカスタムコントロールにフォーカスが移るようで、
キーイベントも来るのですが・・・

ちぇっく 2003/10/29(水) 17:37:47
今、ちょっと自作テストしてみた範囲では、何の問題も無くできました。
処理方針は、

>WM_GETDLGCODEをコントロールで受けてDLGC_WANTMESSAGEを返しているのですが、
>WS_TABSTOPはつけてますが、

と同じです。あとは特別なことは何もしてませんがTAB移動もできるし、
コントロールにWM_KEYDOWNも届きます。

ボタン間のタブ移動はできているのですか?
カスタムコントロールとは、自分でウィンドウクラスを登録したものですよね?
カスタムコントロールをCreateWindow()ではなくダイアログに直接を貼り付けてもだめです
か?
カスタムコントロールのウィンドウプロシージャでWM_SETFOCUSはどんな処理ですか?
(DefWindowProcしている?)
Spy++で見たとき、
ダイアログの直接の子になっていますか?
ウィンドウスタイルの数値はいくつになってますか?

ちぇっく 2003/10/29(水) 18:01:36
> SetFocus()じゃダメです。ボタンにフォーカス移っちゃいます。

SetFocus() はどの場所で試しましたか?
WM_INITDIALOGだったら、その場合は FALSE を返さないとだめです。

SunPac 2003/10/29(水) 18:13:25
お手数かけて申し訳ないです。
うーん、やっぱりダメです。

リソースにはりましたが動作は同じです。
WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | WS_HSCROLL
というスタイルです。
WM_SETFOCUSもDefWindowProc()にまかせてます。
Spy++でちゃんとダイアログの子だということも確認しています。
でもダメ。ボタンにしかフォーカス移らないです。
ボタン間ではちゃんと移動しています。
なぜなんでしょう、本当に。

SunPac 2003/10/29(水) 18:23:37
[[解決]]
とりあえずTAB移動はダメですがコントロールにフォーカスは移せました。
キーイベントももちろんOK。
IsDialogMessage()を処理しないようにし、
WM_COMMANDでコントロールにSetFocus()する事で常にコントロールにフォーカスが
あるようにして対処しました。
まあ、とりあえず問題なさそうなので解決とします。

みなさん、本当にありがとうございました。
・・・しかしタブジャンプでコントロールに飛べないのは謎ですね。

ボタンをサブクラス化してフォーカスを切り替えればうまくいきそうだけど・・・
めんどうだし(笑)

ちぇっく 2003/10/29(水) 18:44:01
>WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | WS_HSCROLL
>というスタイルです。

同じスタイルで試しても、OKでした。
これまでに提示された情報の範囲では、私の知恵では原因が思い浮かびません。

私が試してみたのと同様、最小コードのサンプルを作って試してみるのがいいと思います。
で、
うまくいくようなら、違いを探す。
うまくいかなければ、最小コードのサンプルのほうを提示してみる。

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