十字キーで項目の移動をするには?

[戻る]
のっち [E-Mail] 2001/02/19(月) 16:07:44
Win32 Applicationでプログラムを作っています。
ダイアログでエディットボックスをいくつか置いてあるのですが、移動を十字キーを使って移動したいのです。どうしたらいいですか?
教えてください。おねがいします!

ku 2001/02/19(月) 22:18:08
複数のエディットボックス間をカーソルキーでフォーカス移動したいのですよね?
PreTranslateMessageでWM_KEYDOWNを捕まえて
フォーカスを設定したいエディットボックスにSetFocusすればできそうです

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

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

ku 2001/03/01(木) 10:08:42
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 2001/03/01(木) 10:11:58
デバッガーを使っていると、フックがうまく継続しないようなので
ここのテストはデバッガーを使ってはできないようですので、気を付けてください。

ku 2001/03/01(木) 10:21:00
メインウィンドウがダイアログだとうまくいきませんでした
うーむ

ku 2001/03/01(木) 10:35:36
hHook = SetWindowsHookEx(WH_KEYBOARD, KeyDownH, hInst, GetCurrentThreadId());
とやった方が良いようですね

のっち 2001/03/06(火) 15:43:57
[[解決]]
kuさんいつもありがとうございます。
よくわかりました。

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

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