Contents Up Previous Next

ウィンドウサイズの概要

wxWindow のサイズに関連する属性について、お互いの関係やサイザーとの関わりについて時どき混乱することがあるかと思います。このドキュメントはそれらをほんの少しでも明確にするためのものであり、それらの関係性について簡単な説明を行います。

最適サイズ: ウィジェットの最適サイズはウィジェットの種類と、通常はウィジェットの内容物に依存します。例えば wxListBox の最適サイズは特定の上限までの間でアイテム数に応じて計算されます。また、wxButton の最適サイズはラベルのサイズに応じて計算されますが、(スタイルフラグで上書きしない限り) 通常はプラットフォームのデフォルトのボタンサイズより小さくなることはありません。分かりますか? C++ のウィンドウクラスには DoGetBestSize() と呼ばれる特別な仮想関数があり、内容物に基づいて独自の最適サイズを計算したい場合にはこの関数をオーバーライドする必要があります。デフォルトの DoGetBestSize()wxPanel といったコンテナウィンドウに使用するために設計されており、それはこのように動作します:

  1. ウィンドウでサイザーが使用されていれば、それが最適サイズの計算に使用されます。
  2. そうでない場合、ウィンドウでレイアウト制約が使用されていれば、それが最適サイズの計算に使用されます。
  3. そうでない場合、ウィンドウが子コントロールを持っていれば、すべての子コントロールを表示するのに充分な最適サイズが設定されます。
  4. そうでない場合、子コントロールが存在しないのであれば、ウィンドウの最小サイズが最適サイズに使用されます。
  5. そうでない場合、最小サイズが設定されていないのであれば、現在のサイズが最適サイズに使用されます。

最小サイズ: ウィジェットの最小サイズは通常、プログラマが SetMinSize() 関数か SetSizeHints() 関数のどちらかを使用して明示的に設定するサイズです。また、大半のコントロールはコンストラクタにデフォルト値以外の値が指定された場合にそれを最小サイズとして設定します。wxFrame といったトップレベルウィンドウはユーザが最小サイズ以下にリサイズすることはできません。

サイズ: ウィジェットのサイズは SetSize() 関数や GetSize() 関数で明示的に設定・取得することができます。このサイズの値は画面内でウィジェットが使用しているサイズであり、サイザーで管理されていないウィジェットのサイズを変更する方法でもあります。

クライアントサイズ: クライアントサイズはボーダーの内側の領域を表しており、この領域は EVT_PAINT イベントで描画できます。ウィジェットがボーダーを持たない場合、クライアントサイズはウィジェットのサイズと同じ大きさになります。

初期サイズ: ウィジェットの初期サイズはウィジェットのコンストラクタで指定されたサイズのことです。上で述べたように、ほとんどのコントロールではこのサイズがコントロールの最小サイズとしても使用されます。コンストラクタで指定された値がデフォルトの wxDefaultSize の場合、もしくは (wxSize(150,-1) といったように) 完全に指定されていない場合、ほとんどのコントロールでは足りない部分を最適サイズを使用して補完し、その結果を初期サイズとして設定します。

GetEffectiveMinSize(): (以前は GetBestFittingSize でした) ウィジェットの最小サイズと最適サイズを混ぜあわせたもので、最小サイズよりも優先されます。例えば、ウィジェットの最小サイズが (150, -1)、最適サイズが (80, 22) の場合、最適フィットサイズは (150, 22) になります。最小サイズが (50, 20) の場合は (50, 20) が最適フィットサイズになります。この関数はサイザー内の各要素の要求サイズを決定するときにサイザーから呼ばれ、サイザーの必要とする最小サイズを計算するために使用されます。

SetInitialSize(size): (以前は SetBestFittingSize でした) これは通常のサイズ設定関数とは少しだけ異なります。単に "初期サイズ" を設定するのではなく、引き渡された値を最小サイズに設定し、その値を最適サイズと混ぜあわせた上で、その結果をウィジェットのサイズとして設定します。そのため、この関数を "賢い SetSize" と考えることができます。この関数はコントロールの最小サイズと初期サイズを設定するためにほとんどのコントロールのコンストラクタで呼ばれます。

window.Fit(): Fit() 関数は子コントロールにフィットするようにウィンドウのサイズを設定します。子コントロールを持たない場合は何も行いませんが、子コントロールを持つ場合はそのウィンドウの最適サイズにあわせてウィンドウサイズを設定します。

sizer.Fit(window): これは (他のいくつかの制約とあわせて) サイザーの要求する最小サイズを充分満たすようにウィンドウサイズを設定します。ウィンドウに割り当てられているサイザーがひとつだけの場合は window.Fit() と等価になります。

sizer.Layout(): サイザー内の各要素が必要とする最小サイズを再計算し、現在サイザーに割り当てられているスペース内に各要素を配置します。

window.Layout(): ウィンドウがサイザーを持つ場合に、現在のウィンドウサイズにあわせてサイザーが利用可能なスペースを設定します。これにより sizer.Layout() が呼び出されます。ウィンドウがサイザーの代わりにレイアウト制約を使用している場合は制約アルゴリズムが実行されます。Layout() 関数はコンテナウィンドウのデフォルトの EVT_SIZE ハンドラから呼ばれます。