2009-07-20 56 views
3

Win32 API C++プロジェクトでは、タブコントロール(3タブ)とタブコントロールの子である3つのダイアログを持つダイアログがあります。 DialogBoxParamを使ったタブコントロールと、CreateDialogParamを使ってリソースからの子ダイアログをロードしてメインダイアログを読み込みます。メインダイアログに子ダイアログが表示されます。タブをクリックすると正しい子ダイアログが表示/非表示され、正常に動作します。ネストされたダイアログ(WS_EX_CONTROLPARENT)を持つタブコントロールのタブ順序

タブオーダーについて検索したところ、WS_EX_CONTROLPARENTスタイルがタブコントロールに設定され、タブダイアログが子ダイアログウィンドウに作用することがわかりました。 1つの問題点を除いて、これはうまくいきます:タブコントロール自体にフォーカスがないので、タブコントロールにタブで移動してキーボードで別のタブに変更することはできません。キーボードフォーカスは、子ダイアログ、メインダイアログのボタン、子ダイアログへの戻り、タブコントロール自体では決して停止しないので、タブコントロールをクリックしてタブを変更する必要があります。それは私を夢中にさせている。助言がありますか?

更新:私はWS_EX_CONTROLPARENTを完全に忘れて、タブコントロールの子ダイアログを兄弟にすることで問題を回避することができました。副作用のみが再描画中にコントロールの点滅が増えているように見えますが、タブの子ダイアログを子どもたちがきれいに見せるようになって以来、まだ答えが好きです。

答えて

3

そのクリーナーではありません。タブ付きダイアログを作成するための推奨される方法は、タブページをダイアログの子にすることです。タブコントロールは、どのページが表示されているかを制御するだけで、親ではありません。

これは、ダイアログでXPテーマ設定を実行しようとする可能性がある場合に特に重要です。

WS_EX_CONTROLPARENTは、実際の 'タブ'ダイアログで設定するためのスタイルです。

タブコントロール自体にWS_TABSTOPを設定したとしますか?私は、WS_TABSTOPWS_EX_CONTROLPARENTが、ダイアログ・マネージャーに、タブ・サイクルがコントロールに到達したときに2つの全く異なる相反することを行うように指示するので、同時に設定すると矛盾すると思います。

最後に、ダイアログページがタブコントロールではなくダイアログの子であるため、ちらつきが増えるという理由は全くありません。

+0

私のために働く。ダイアログの子をタブコントロールの子にするネットが多すぎると、MSはドキュメント内で明確にしません。私は以来、XPのタブのテーマを有効にして、それは正常に動作します。 – Jay

0

タブでは、デザインのダイアログの子コントロールがタブインされるため、AFAIKできません。あなたができることは、タブのkeydownイベントを前処理することです。フォーカスがダイアログの最後のコントロールにある場合は、タブページをフォーカスしてイベントを破棄します。あなたがすでに持っている解決策よりもクリーンではないようです。

+0

DialogProcがTabキーを処理する機会を得られないようだが、これを修正するために私自身のメッセージループを書きたくない。だから私は私が持っていた、そして移った解決策を残すことに決めました。私は同じ問題をオンラインで誰も見つけられなかったことに驚いています。誰もがWS_EX_CONTROLPARENTを使用して、この新しい問題を生成します。 – Jay

関連する問題