ダイアログでキー入力メッセージを受けたい – プログラミング – Home

ダイアログでキー入力メッセージを受けた...
 
通知
すべてクリア

[解決済] ダイアログでキー入力メッセージを受けたい


SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

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


引用未解決
トピックタグ
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

質問変更します。

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


返信引用
tipe
 tipe
(@tipe)
ゲスト
結合: 22年前
投稿: 11
 

ダイアログでキーボードイベントを取得して
それをカスタムコントロールに
無理やり投げるのではだめでしょうか?


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

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


返信引用
tipe
 tipe
(@tipe)
ゲスト
結合: 22年前
投稿: 11
 

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


返信引用
ちぇっく
 ちぇっく
(@ちぇっく)
ゲスト
結合: 22年前
投稿: 5
 

モードレスダイアログですか.
メッセージループに IsDialogMessage の処理は入れてありますか?


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

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

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

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


返信引用
ちぇっく
 ちぇっく
(@ちぇっく)
ゲスト
結合: 22年前
投稿: 5
 

今、ちょっと自作テストしてみた範囲では、何の問題も無くできました。
処理方針は、

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

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

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


返信引用
ちぇっく
 ちぇっく
(@ちぇっく)
ゲスト
結合: 22年前
投稿: 5
 

> SetFocus()じゃダメです。ボタンにフォーカス移っちゃいます。

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


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

お手数かけて申し訳ないです。
うーん、やっぱりダメです。

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


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

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

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

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


返信引用
ちぇっく
 ちぇっく
(@ちぇっく)
ゲスト
結合: 22年前
投稿: 5
 

>WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | WS_HSCROLL
>というスタイルです。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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