お世話になっています、KitaKataです。
タイトル:CreateWindowしたエディットボックスのフォント色TABについて
で頂いたヒントを元に情けない'オチ'ながら原因がわかったのですが
なぜかこれまで使えていたショートカットキーが使えないことがわかりました。
具体的には、コールバックプロシージャの case WM_KEYDOWN: 内で拾っていた矢印キー Ctrl+矢印キー Shist+矢印キー が全滅で、矢印キーを押した瞬間にエディットボックスにフォーカスが移動してしまいます。
ただ、RollUP(VK_PRIOR) や VK_NEXT(RollDown) はこれまで通り使えます。
以下のように 矢印キーの時に無理矢理フォーカスを戻そうとしましたが
矢印キーを押した瞬間に移動してしまい WM_KEYDOWN:内にもメッセージ
がこなくなってしまいます。
case WM_KEYDOWN:
switch (wparam){
case VK_RIGHT: //→キー
SetFocus(hwnd);
・
・
・
break;
希望の動作としてはマウスのクリックなどで意図的にエディットボックスに
フォーカスを移すまではメインのコールバックプロシージャの
case WM_KEYDOWN: にメッセージが来てほしいのですがどうすればいいのでしょうか?
ヒントでも頂けるとありがたいです、よろしくお願いします
試行錯誤の結果
case WM_KEYDOWN:
を
case WM_KEYUP:
に変えて処理を記述すると ←キー と ↑キーは単独でも Ctrl や Shiftの組み合わせでも使えることがわかりました。
IsDialogMessage() が何するものなのか分かれば、
回避策は見えてきそうな気がしますが。
http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_isdialogmessage.asp
dairygoodsさん
ありがとうございます。
試行錯誤するにもマニュアルをよく読んでからですね
適当な試行錯誤がおおくて反省です・・
case WM_KEYUP:では感覚的に違和感があるので case WM_KEYDOWN:
で動作するようにがんばりたいと思います。
dairygoodsさんが教えてくださった
MSDNの IsDialogMessage ですがこのページの説明は難しく
具体的にどうすればいいのか掴めませんでした。
しかし、IsDialogMessage をキーワードにググった情報をもとに自分なりに
アレンジしてみたところ以下の方法で動作するようになったのですが・・・
メッセージループに入った直後にメインウィンドウのハンドルを持つ
VK_KEYDOWNのメッセージを捕まえて、以下のように
↓キーなら wParamを VK_DOWN_O に書き換えました。
VK_DOWN_O は
#define VK_DOWN_O 51001
としました。
case VK_DOWN:
msg.wParam = VK_DOWN_O ;
コールバックプロシージャの方は
case VK_DOWN: を case VK_DOWN_O: と変更し
それまでの処理はそのままで希望の動作をするようになりました。
なんか危ないことをしていますでしょうか?
そういう回避策でもよいと思いますが、
IsDialogMessage() に矢印キーのメッセージを横取られるの
を防ぐのであれば、単に呼ばなければ良いのでは?
while (GetMessage(&msg,NULL,0,0))
{
if (矢印キーダウン || !::IsDialogMessage(hDlg,&msg) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
まじめにやる場合は、WM_GETDLGCODE を
使うような気がしますが、未確認です。
dairygoods さん
>まじめにやる場合は、WM_GETDLGCODE を
また調べていろいろ試してみたいと思います。
ありがとうございました。
ツイート | ![]() |