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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 抽出結果を別シートに貼り付ける 2 2022/07/09 22:59
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- その他(プログラミング・Web制作) Pythonを勉強しています。 5 2023/08/25 09:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
Tabコントロールに貼り付けたダイアログ内のフォーカス移動について
C言語・C++・C#
-
VC++からブラウザを起動して・・・
C言語・C++・C#
-
CStaticコントロールの静的イメージ描画
C言語・C++・C#
-
-
4
Win32 API エディットボックス内文字列の色変更
C言語・C++・C#
-
5
SetDlgItemInt( ) c++
C言語・C++・C#
-
6
SetDlgItemTextの使い方について
C言語・C++・C#
-
7
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのコントロールツール...
-
コントロールの書式設定で、“コ...
-
DateTimePickerでに年月までし...
-
WM_SIZEを発生させる方法
-
フォームでPDFを表示させた...
-
エクセル - リストボックスのマ...
-
VisualStudio MFC変数が追加で...
-
連続で印刷すると画像が更新さ...
-
C++6.0でのresource.hについて
-
ウィンドウやボタンコントロー...
-
警告表示を非表示にしたい
-
タブインデックスをより簡単に...
-
C#でパネルに子パネルを上から...
-
VB タブページの自動切り替え...
-
VScrollBarの点滅を何とかしたい。
-
ActiveXコントロールを.NETにイ...
-
文字色を変えたい(ACCESS VBA)
-
MFCのプロジェクト作成時にコモ...
-
ActiveXコントロールの...
-
タブコントロール上のリストコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
フォームでPDFを表示させた...
-
スピンボタンを右クリックして...
-
DateTimePickerでに年月までし...
-
C++6.0でのresource.hについて
-
連続で印刷すると画像が更新さ...
-
ActiveXコントロールを.NETにイ...
-
警告表示を非表示にしたい
-
エクセル - リストボックスのマ...
-
コモンダイアログコントロール...
-
EXCELVBA リストボックスで選択...
-
TabControlとToolBarの背景色変更
-
ワードのドロップダウンリスト
-
文字色を変えたい(ACCESS VBA)
-
CEdit の内容が変わった時にメ...
-
リストボックスの同期
-
VB6.0のデザイン時 コントロー...
-
WM_SIZEを発生させる方法
-
VBAでリストボックス内で↑↓の操...
おすすめ情報