- ベストアンサー
WS_TABSTOPが機能しないコントロールを作っていますが、なぜ素通りされるのか分かりません
- 質問者はダイアログに貼り付けた独自のコントロールが、TABキーでフォーカスが移動されないことに困っています
- WS_TABSTOPを指定しているが、スタイルの値がWS_MINIMIZEBOXと同じになっていることに気づきました
- SPY++で調べるとスタイルの値が異なる表示になっており、なぜ区別されているのか疑問に感じています
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
GetNextDlgTabItem によるフォーカス移動は確認済みでしょうか? 私が見ている古い Win32 の説明には 「Windowsは、 GetNextDlgTabItem関数を使って、 表示されていて使用不能ではなく、 WS_TABSTOPスタイルを持つ次のコントロールを探します。」 と有ります。 私は最初の2つのどちらかが条件を満たしていない気がします。
その他の回答 (1)
- Wr5
- ベストアンサー率53% (2173/4061)
>今さらながらWS_TABSTOPはWS_MINIMIZEBOXと同じ値であることに WS_MAXIMIZEBOXですよね? >同じ値であるのにWS_TABSTOPとWS_MINIMIZEBOXを区別して表示しています。 >これは、どういう理屈なのでしょうか? Spy++が値をどう表示するか…の問題かと。 WS_SYSMENUがある=>WS_MAXIMIZEBOX WS_CAPTIONがある=>WS_MAXIMIZEBOX ウィンドウクラス名がコントロールとして登録済みのもの=>WS_TABSTOP とか……。 で、TABキーで移動できない。 っていう独自コントロールはどのように作成していますか? あと…そのダイアログはどのように生成していますか? http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+200506/05060084.txt こんな話もあるみたいですが…。
お礼
Wr5さん、早速のコメントありがとうございます。 >>今さらながらWS_TABSTOPはWS_MINIMIZEBOXと同じ値であることに >WS_MAXIMIZEBOXですよね? そうですね。勘違いです。 ご指摘ありがとうございます。 >Spy++が値をどう表示するか…の問題かと。 それはそのとおりだと思います。おそらくSPY++自体はウィンドウクラスあたりから判定しているのだと思います。そうでないと、例えばボタンスタイルなんかは判別できませんから。 でも、Windows自体は何かの条件でスタイル値=0x00010000をWS_TABSTOPかWS_MAXIMIZEBOXのどちらの意味であるかを区別しているはずですよね。その理屈が知りたいのです。 少なくとも、WS_SYSMENUやWS_CAPTIONスタイルで判別しているわけではないようです。SPY++で見る限りでは、普通のボタンでも、私が作ったコントロールでもWS_SYSMENUやWS_CAPTIONスタイルはついていませんが、普通のボタンしかTABキーで止まってくれません。 >っていう独自コントロールはどのように作成していますか? MFCのCWnd派生クラスとしています。 ウィンドウクラスはAfxRegisterWndClass()で独自のクラスを与えています。 コントロールの生成時には、WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUPスタイルを指定しています。 このコントロールはWM_GETDLGCODEを処理して、DLGC_WANTARROWSとDLGC_WANTCHARSを返すようにしています(コントロールはキー操作を受け取る必要があるため)。 >あと…そのダイアログはどのように生成していますか? ダイアログ自体は、普通にリソースエディタで作ったダイアログテンプレートをCDialogクラスに渡してCreate()しているだけです(モードレスダイアログ)。 そして、WM_INITDIALOG中で自前のコントロールを動的に生成して追加しています。 このダイアログ中の他のコントロール(リソースエディタで設定したもの)については正しくTABストップしますので、ダイアログそのものは問題ではないとおもっています。 >http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+200506/05060084.txt ありがとうございます。 ざっくり読んでみましたが、ダイアログ自体をカスタマイズしたいという訳でもないし、基本的にダイアログ自体はTABキーを正しく処理しているようですので関係がないというふうに理解しました。 問題は、ダイアログ上のコントロールである自前のウィンドウ側にあると考えています。 何か、お気づきの点はあればよろしくお願いします。
お礼
davidfoxさん、回答ありがとうございます。 GetNextDlgTabItem()で試してみることは気がつきませんでした。 試してみたところ、やはり素通りしました。ダイアログ上のTABキー操作でも結局はGetNextDlgTabItem()相当の処理で次のコントロールを探すのでしょうから、結果は同じになったのでしょう。 で、試行錯誤の末、原因が分かりました。 つまらないミスですが、コントロールそのものにWS_EX_CONTROLPARENT拡張スタイルが設定されていたのがNGでした。これを外すとTABキーで止まるようになりました。