続:CreateWindowしたエディットボックスのTABについて

解決


KitaKata  2005-11-19 01:00:16  No: 59679

お世話になっています、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: にメッセージが来てほしいのですがどうすればいいのでしょうか?
ヒントでも頂けるとありがたいです、よろしくお願いします


KitaKata  2005-11-19 01:59:00  No: 59680

試行錯誤の結果 

 case WM_KEYDOWN:

 を

 case WM_KEYUP:

 に変えて処理を記述すると ←キー と ↑キーは単独でも Ctrl や Shiftの組み合わせでも使えることがわかりました。


dairygoods  2005-11-22 18:55:03  No: 59681

IsDialogMessage() が何するものなのか分かれば、
回避策は見えてきそうな気がしますが。

http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_isdialogmessage.asp


KitaKata  2005-11-22 20:39:38  No: 59682

dairygoodsさん

ありがとうございます。
試行錯誤するにもマニュアルをよく読んでからですね
適当な試行錯誤がおおくて反省です・・

case WM_KEYUP:では感覚的に違和感があるので case WM_KEYDOWN:
で動作するようにがんばりたいと思います。


KitaKata  2005-11-23 00:35:23  No: 59683

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: と変更し
それまでの処理はそのままで希望の動作をするようになりました。

なんか危ないことをしていますでしょうか?


dairygoods  2005-11-23 01:44:18  No: 59684

そういう回避策でもよいと思いますが、
IsDialogMessage() に矢印キーのメッセージを横取られるの
を防ぐのであれば、単に呼ばなければ良いのでは?

while (GetMessage(&msg,NULL,0,0))
{
   if (矢印キーダウン || !::IsDialogMessage(hDlg,&msg) )
   {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
   }
}

まじめにやる場合は、WM_GETDLGCODE を
使うような気がしますが、未確認です。


KitaKata  2005-11-23 06:01:15  No: 59685

dairygoods さん

>まじめにやる場合は、WM_GETDLGCODE を

また調べていろいろ試してみたいと思います。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加