
Windowsにおいてダイアログに貼り付ける独自のコントロールを作っているのですが、TABキーでコントロールのフォーカスを移動させたとき、自分のコントロールを素通りしてしまいます。
もちろんウィンドウスタイルにWS_TABSTOPを指定して生成しているのですが、今さらながらWS_TABSTOPはWS_MINIMIZEBOXと同じ値であることに気づきました。
もしかすると、WS_TABSTOPではなく、WS_MINIMIZEBOXとして認識されているのではないか?と思いましたが、
その違いがどのように判別されているのかが分かりませんでした。
SPY++で調べてみると、確かに今回問題のコントロールのスタイルは0x50030000となっていますが、SPY++はこれをWS_CHILDWINDOW、WS_VISIBLE、WS_MINIMIZEBOX、WS_MAXIMIZEBOXと表示しています。
一方、普通にダイアログに貼り付けたプッシュボタンでは、スタイルは0x50010000なのにSPY++はWS_CHILDWINDOW、WS_VISIBLE、WS_TABSTOP、BS_PUSHBUTTONとなっていて、同じ値であるのにWS_TABSTOPとWS_MINIMIZEBOXを区別して表示しています。
これは、どういう理屈なのでしょうか?
ご存じの方、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
GetNextDlgTabItem によるフォーカス移動は確認済みでしょうか?
私が見ている古い Win32 の説明には
「Windowsは、 GetNextDlgTabItem関数を使って、 表示されていて使用不能ではなく、 WS_TABSTOPスタイルを持つ次のコントロールを探します。」
と有ります。
私は最初の2つのどちらかが条件を満たしていない気がします。
davidfoxさん、回答ありがとうございます。
GetNextDlgTabItem()で試してみることは気がつきませんでした。
試してみたところ、やはり素通りしました。ダイアログ上のTABキー操作でも結局はGetNextDlgTabItem()相当の処理で次のコントロールを探すのでしょうから、結果は同じになったのでしょう。
で、試行錯誤の末、原因が分かりました。
つまらないミスですが、コントロールそのものにWS_EX_CONTROLPARENT拡張スタイルが設定されていたのがNGでした。これを外すとTABキーで止まるようになりました。
No.1
- 回答日時:
>今さらながら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/vcln …
こんな話もあるみたいですが…。
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/vcln …
ありがとうございます。
ざっくり読んでみましたが、ダイアログ自体をカスタマイズしたいという訳でもないし、基本的にダイアログ自体はTABキーを正しく処理しているようですので関係がないというふうに理解しました。
問題は、ダイアログ上のコントロールである自前のウィンドウ側にあると考えています。
何か、お気づきの点はあればよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
ダイアログボックスのボタンコ...
-
エクセルのコントロールツール...
-
DateTimePickerでに年月までし...
-
VisualBasic 2010でVB6で使って...
-
EXCELVBA リストボックスで選択...
-
エクセル - リストボックスのマ...
-
ActiveXコントロールを.NETにイ...
-
Access2000でボタンを押した際...
-
ラジオボタンのグループ化の方法
-
リストコントロール(MFC or API...
-
TabControlとToolBarの背景色変更
-
コンボボックスでコントロール...
-
MFC・ダイアログベースで、ダイ...
-
連続で印刷すると画像が更新さ...
-
VB6.0のデザイン時 コントロー...
-
VB6でタブコントロールが見つか...
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
DateTimePickerでに年月までし...
-
スピンボタンを右クリックして...
-
コモンダイアログコントロール...
-
連続で印刷すると画像が更新さ...
-
ActiveXコントロールを.NETにイ...
-
VB6でタブコントロールが見つか...
-
EXCELVBA リストボックスで選択...
-
エクセル - リストボックスのマ...
-
フォームでPDFを表示させた...
-
警告表示を非表示にしたい
-
Accessのタブコントロールを2...
-
ワードのドロップダウンリスト
-
MFC・ダイアログベースで、ダイ...
-
リストコントロール(MFC or API...
-
リストボックスの同期
-
プロパティシートのタブの名前...
-
Excel VBAでのMultipageの選択
-
TabControlとToolBarの背景色変更
おすすめ情報