アプリ版:「スタンプのみでお礼する」機能のリリースについて

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を区別して表示しています。
これは、どういう理屈なのでしょうか?

ご存じの方、よろしくお願いします。

A 回答 (2件)

GetNextDlgTabItem によるフォーカス移動は確認済みでしょうか?


私が見ている古い Win32 の説明には
「Windowsは、 GetNextDlgTabItem関数を使って、 表示されていて使用不能ではなく、 WS_TABSTOPスタイルを持つ次のコントロールを探します。」
と有ります。

私は最初の2つのどちらかが条件を満たしていない気がします。
    • good
    • 0
この回答へのお礼

davidfoxさん、回答ありがとうございます。

GetNextDlgTabItem()で試してみることは気がつきませんでした。
試してみたところ、やはり素通りしました。ダイアログ上のTABキー操作でも結局はGetNextDlgTabItem()相当の処理で次のコントロールを探すのでしょうから、結果は同じになったのでしょう。

で、試行錯誤の末、原因が分かりました。
つまらないミスですが、コントロールそのものにWS_EX_CONTROLPARENT拡張スタイルが設定されていたのがNGでした。これを外すとTABキーで止まるようになりました。

お礼日時:2012/08/19 23:27

>今さらながら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 …
こんな話もあるみたいですが…。
    • good
    • 0
この回答へのお礼

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キーを正しく処理しているようですので関係がないというふうに理解しました。
問題は、ダイアログ上のコントロールである自前のウィンドウ側にあると考えています。

何か、お気づきの点はあればよろしくお願いします。

お礼日時:2012/08/18 22:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています