wxWindow のサイズに関連する属性について、お互いの関係やサイザーとの関わりについて時どき混乱することがあるかと思います。
このドキュメントはそれらをほんの少しでも明確にするためのものであり、それらの関係性について簡単な説明を行います。
用語集
- "サイズ": これはウィンドウの現在のサイズで、SetSize() 関数や GetSize() 関数で明示的に設定・取得することができます。このサイズの値は画面内でウィジェットが使用しているサイズであり、サイザーで管理されていないウィジェットのサイズを変更する方法でもあります。
- "クライアントサイズ": クライアントサイズはボーダーの内側の領域を表しており、この領域は
EVT_PAINT
イベントで描画できます。wxFrame の場合、クライアントサイズにはフレームメニュー、ツールバー、ステータスバーも含まれません。ウィンドウがボーダーを持たない場合 (そしてステータスバーなどを含む wxFrame でない場合)、クライアントサイズはウィンドウのサイズと同じ大きさになります。
- "最適サイズ": ウィジェットの最適サイズはウィジェットの種類と、通常はウィジェットの内容物に依存します。例えば wxListBox の最適サイズは特定の上限までの間でアイテム数に応じて計算されます。また、wxButton の最適サイズはラベルのサイズに応じて計算されますが、(スタイルフラグで上書きしない限り) 通常はプラットフォームのデフォルトのボタンサイズより小さくなることはありません。C++ のウィンドウクラスには wxWindow::DoGetBestSize() と呼ばれる特別な仮想関数があり、内容物に応じて独自の最適サイズを計算したい場合にはこの関数をオーバーライドすることができます。ただし、通常は DoGetBestClientSize() をオーバーライドした方が便利です。下記を参照してください。
- "最適クライアントサイズ": これは単に最適ウィンドウサイズのクライアントサイズ版です。指定された内容物にフィットするサイズが計算されると、通常はそれがクライアントサイズになり、それにボーダーのサイズを加えることで全体の最適サイズを取得します。このため、DoGetBestClientSize() をオーバーライドする方がより望ましく、それに基づいて DoGetBestSize() が全体の最適サイズを計算するようにしてください。
- "初期サイズ": ウィジェットの初期サイズはウィジェットのコンストラクタで指定されたサイズのことです。上で述べたように、ほとんどのコントロールではこのサイズがコントロールの最小サイズとしても使用されます。コンストラクタで指定された値がデフォルトの wxDefaultSize の場合、もしくは (wxSize(150,-1) といったように) 完全に指定されていない場合、ほとんどのコントロールでは足りない部分を最適サイズを使用して補完し、その結果を初期サイズとして設定します。
- "仮想サイズ": 仮想サイズはウィジェットで潜在的に表示可能な領域のサイズのことです。ウィジェットの仮想サイズは実際のサイズよりおそらく大きく、その場合にはユーザがウィジェットの内容全体を '探索' できるようにスクロールバーが表示されます。より詳しい情報は wxScrolled を参照してください。
サイズ関連の関数
- wxWindow::GetEffectiveMinSize(): ウィジェットの最小サイズと最適サイズを混ぜあわせたものを返却します。このサイズは最小サイズよりも優先されます。例えば、ウィジェットの最小サイズが (150, -1)、最適サイズが (80, 22) の場合、最適フィットサイズは (150, 22) になります。最小サイズが (50, 20) の場合は (50, 20) が最適フィットサイズになります。この関数はサイザー内の各要素の要求サイズを決定するときにサイザーから呼ばれ、サイザーの必要とする最小サイズを計算するために使用されます。
- wxWindow::SetInitialSize(): これは通常のサイズ設定関数とは少しだけ異なります。単に "初期サイズ" を設定するのではなく、引き渡された値を最小サイズに設定し、その値を最適サイズと混ぜあわせた上で、その結果をウィジェットのサイズとして設定します。そのため、この関数を "賢い SetSize" と考えることができます。この関数はコントロールの最小サイズと初期サイズを設定するためにほとんどのコントロールのコンストラクタで呼ばれます。
- wxWindow::Fit(): この関数は子コントロールにフィットするようにウィンドウのサイズを設定します。子コントロールを持たない場合は何も行いませんが、子コントロールを持つ場合はそのウィンドウの最適サイズにあわせてウィンドウサイズを設定します。
- wxWindow::Layout(): ウィンドウがサイザーを持つ場合に、現在のウィンドウサイズにあわせてサイザーが利用可能なスペースを設定します。これにより wxSizer::Layout() が呼び出されます。ウィンドウがサイザーの代わりにレイアウト制約を使用している場合は制約アルゴリズムが実行されます。
Layout()
関数はコンテナウィンドウのデフォルトの EVT_SIZE
ハンドラから呼ばれます。