クラス: wxDialog, wxDialogLayoutAdapter
ダイアログボックスはパネルに似ており、コントロールを配置するために使用するウィンドウですが、以下の例外があります:
ファイルの選択を含む、ダイアログの便利関数は ダイアログ を参照してください。
また、wxDialog が継承している関数については wxTopLevelWindow と wxWindow を参照してください。コントロールのバリデーションは wxValidator の概要 で触れています。
様々なモバイル端末が市場に出回るにつれ、プログラマに過度の負担をかけることなく、アプリケーションをそれらのプラットフォームへ適応させることが wxWidgets に求められるようになってきました。wxWidgets が支援できることのひとつにダイアログを (より小さいフォームファクタに付きものな) より低解像度の画面に適応させることが挙げられます。そのために wxDialog ではグローバルな wxDialogLayoutAdapter クラスを提供しており、このクラスではサイザーを利用した大半のダイアログに対して自動スクロール機能を適用させることができます。
したがって、ダイアログのことを気にかけている限り、少し、もしくはまったく手を加えることなく、多くのアプリケーションを小さな画面に適応させることができるはずです。デフォルトではこの適応は無効になっています。スクロールに関する適応をアプリケーション内でグローバルに切り替える場合、静的関数 wxDialog::EnableLayoutAdaptation に true を渡します。また、ダイアログごとに適応を行なうかどうかを指定する場合は wxDialog::SetLayoutAdaptationMode に wxDIALOG_ADAPTATION_MODE_DEFAULT
(グローバルな設定を使用)、 wxDIALOG_ADAPTATION_MODE_ENABLED
、 wxDIALOG_ADAPTATION_MODE_DISABLED
のいずれかを指定します。
最後のふたつのモードは適応に関するグローバルな設定を上書きします。適応を有効にすると、ダイアログを表示するのに画面サイズが小さすぎる場合に wxWidgets (と言うより標準の適応クラスである wxStandardDialogLayoutAdapter) が標準ボタンをダイアログ下部の非スクロール領域に残してダイアログの一部をスクロールするようにします。wxDialog::Show や wxDialog::ShowModalから呼ばれた wxDialogLayoutAdapter::DoLayoutAdaptation の中では次のように処理が行われます:
wxID_OK
や wxID_CANCEL
などの識別子を持つ、ひとつ以上の標準ボタンを含む水平方向の wxBoxSizer を探します。 グローバル、またはダイアログごとの適応の切り替えに加えて、wxDialog::SetLayoutAdaptationLevel を設定することでどれだけ積極的に標準ボタンを探しに行くかを選択することができます。デフォルトでは上で述べた処理がすべて行われますが、レベルを 1 に設定することで wxStdDialogButtonSizer のみを探すようにできます。
wxDialog::AddMainButtonId を使用することで非スクロール領域にする標準ボタンとして扱う識別子を追加することができます。
wxDialogLayoutAdapter か wxStandardDialogLayoutAdapter を継承した独自のクラスを作成することができます。その場合、wxDialog::SetLayoutAdapter を呼び出し、返却されてきた古いオブジェクトは削除します。適応の可否の確認や適応を行なうには CanDoLayoutAdaptation と DoLayoutAdaptation をオーバーライドします。
また、wxDialog を継承したクラスで wxDialog::CanDoLayoutAdaptation と wxDialog::DoLayoutAdaptation をオーバライドすることも可能です。
適応はサイザーとウィンドウの階層構造を変更するため、これは確実に行えるものではなく、以下のような状況では適応に失敗します:
次のようにすることで、適応の実施後もダイアログが引き続き正常に動作するようにできます:
wxPropertySheetDialog に対する適応は単純にページをスクロール可能にするだけです。なぜなら、 wxDialog::GetContentWindow がダイアログのブックコントロールを返却し、このコントロールが標準のレイアウトアダプタで処理されるためです。
wxWizard はグローバルなアダプタではなく、独自の CanDoLayoutAdaptation と DoLayoutAdaptation 関数を使用します。繰り返しになりますが、ウィザードページのみがスクロール可能になります。