十字キーで項目の移動をするには? – プログラミング – Home

十字キーで項目の移動をするには?
 
通知
すべてクリア

[解決済] 十字キーで項目の移動をするには?


のっち
 のっち
(@のっち)
ゲスト
結合: 24年前
投稿: 2
Topic starter  

Win32 Applicationでプログラムを作っています。
ダイアログでエディットボックスをいくつか置いてあるのですが、移動を十字キーを使って移動したいのです。どうしたらいいですか?
教えてください。おねがいします!


引用未解決
トピックタグ
ku
 ku
(@ku)
ゲスト
結合: 25年前
投稿: 312
 

複数のエディットボックス間をカーソルキーでフォーカス移動したいのですよね?
PreTranslateMessageでWM_KEYDOWNを捕まえて
フォーカスを設定したいエディットボックスにSetFocusすればできそうです


返信引用
のっち
 のっち
(@のっち)
ゲスト
結合: 24年前
投稿: 21
 

ダイアログボックスで十字キー&Enterキーを使って移動するために
いろいろやってみたんですけど、case文をとおってくれません。
どうしたらいいでしょうか。教えてください。
LRESULT CALLBACK KEISAN(HWND hwndDlg,UINT uMsg,WPARAM wP,LPARAM lP)
{
switch(uMsg){
case WM_KEYDOWN:
if(GetKeyState(VK_RETURN) < 0){
return;
}
}
}


返信引用
ku
 ku
(@ku)
ゲスト
結合: 25年前
投稿: 312
 

MFCかと思って発言してしまったようで申し訳ないです。
DialogBoxを使ってダイアログを表示させているのならちょっと難しそうです。
モードレスダイアログをモーダル風(MFCはこれをやってます)に使えるように工夫して
そこのメッセージループでGetMessageしたらWM_KEYDOWNの辺りをチェックし
必要なメッセージならディスパッチしないで自分で処理するようにすれば
できるかもしれません。
最初にコメントしたPreTranslateMessageはMFCではメッセージループの
GetMessageの後に呼ばれる仕組みになってるので
たぶん、これでうまくいくのではないかと思います。
(試してないので確信ではありませんが)

DialogBoxを使うのならWM_INITDIALOGでコントロール(全てかな?)を
SetWindowsHookExでフックしてWM_KEYDOWNを監視すればうまくいくかもしれません。
んー、これでは面倒ですね。


返信引用
ku
 ku
(@ku)
ゲスト
結合: 25年前
投稿: 312
 

SetWindowsHookExについては嘘を書いてしまったようで申し訳ないです。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_160.htm
ここに使い方が一通り書いてありますので、ご参考にしてください。

左カーソルキーが押されたら、ダイアログでメッセージボックスを表示する
サンプルを作ってみました。
このままだと2回KeyDownHが呼ばれているようなんですが
なぜかは分からなかったので調べてみてください。

フック関数
HWND hDlgSave = NULL;
HHOOK hHook = NULL;
LRESULT CALLBACK KeyDownH(int code, WPARAM wParam, LPARAM lParam)
{
if (code == HC_ACTION) {
if (wParam == VK_LEFT) {
SendMessage(hDlgSave, WM_USER + 1234, 0, 0);
}
}
return CallNextHookEx(hHook, code, wParam, lParam);
}

ダイアログプロシージャ
case WM_INITDIALOG:
hDlgSave = hDlg;
hHook = SetWindowsHookEx(WH_KEYBOARD, KeyDownH, hInst, 0);
return TRUE;
case 終わりのイベント
hDlgSave = NULL;
if (hHook != NULL) {
UnhookWindowsHookEx(hHook);
hHook = NULL;
}
case (WM_USER + 1234):
MessageBox(hDlg, z, test, MB_OK);
break;


返信引用
ku
 ku
(@ku)
ゲスト
結合: 25年前
投稿: 312
 

デバッガーを使っていると、フックがうまく継続しないようなので
ここのテストはデバッガーを使ってはできないようですので、気を付けてください。


返信引用
ku
 ku
(@ku)
ゲスト
結合: 25年前
投稿: 312
 

メインウィンドウがダイアログだとうまくいきませんでした
うーむ


返信引用
ku
 ku
(@ku)
ゲスト
結合: 25年前
投稿: 312
 

hHook = SetWindowsHookEx(WH_KEYBOARD, KeyDownH, hInst, GetCurrentThreadId());
とやった方が良いようですね


返信引用
のっち
 のっち
(@のっち)
ゲスト
結合: 24年前
投稿: 21
 

kuさんいつもありがとうございます。
よくわかりました。

また、質問をしたらよろしくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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