|
|
||||||||||||
|
2-2-5. ウィンドウのサイズと位置ウィンドウのサイズと位置は境界長方形として表現され、その座標は画面または親ウィンドウからの相対座標で指定されます。トップレベルウィンドウの座標は、画面の左上隅からの相対座標になります。また、子ウィンドウの座標は、親ウィンドウの左上隅からの相対座標になります。アプリケーションは、ウィンドウの作成時にその初期状態でのサイズと位置を指定しますが、それらはいつでも変更できます。サイズ ウィンドウのサイズ(幅および高さ)は、ピクセル単位で指定されます。幅または高さが0のウィンドウを作成することもできます。アプリケーションがウィンドウの幅と高さを両方とも0に設定した場合は、Windowsはそのサイズをデフォルトの最小ウィンドウサイズに設定します。デフォルトの最小ウィンドウサイズを取得するには、SM_CXMINフラグとSM_CYMINフラグを指定してGetSystemMetrics関数を使います。アプリケーションでは、特定のサイズのクライアント領域を持つウィンドウを作成したい場合があります。AdjustWindowRect関数およびAdjustWindowRectEx関数は、望ましいクライアント領域のサイズに基づいて、必要なウィンドウのサイズを計算します。これらの関数が返したサイズは、CreateWindowEx関数に渡すことができます。 アプリケーションは、ウィンドウが極端に大きくなるようにサイズを変更することができますが、画面のサイズよりも大きくならないようにしてください。ウィンドウのサイズを設定するときは、その前にSM_CXSCREENフラグとSM_CYSCREENフラグを指定して、GetSystemMetrics関数を呼び出し、画面の幅と高さを調べておくようにしてください。 位置 ウィンドウの位置は、その左上隅の座標として定義されます。この座標はしばしば「ウィンドウ座標」と呼ばれ、常に画面の左上隅からの相対座標になります。ウィンドウが子ウィンドウの場合には、その親ウィンドウのクライアント領域の左上隅からの相対座標になります。たとえば、座標 (10, 10) を持つトップレベルウィンドウは、画面の左上隅の位置から右に10ピクセル、下に10ピクセルの位置に、その左上隅が置かれます。また、座標 (10, 10) を持つ子ウィンドウは、その親ウィンドウのクライアント領域の左上隅の位置から右に10ピクセル、下に10ピクセルの位置に、その左上隅が置かれます。WindowFromPoint関数は、画面上の特定の点を占めているウィンドウのハンドルを取得します。ChildWindowFromPoint関数は、親ウィンドウのクライアント領域内において特定の点を占めている子ウィンドウのハンドルを取得します。 デフォルトのサイズと位置 アプリケーションは、CreateWindowEx関数の中でCW_USEDEFAULT定数を指定することにより、トップレベルウィンドウの初期状態でのサイズと位置をWindowsに計算させることができます。アプリケーションがウィンドウの座標をCW_USEDEFAULTに設定し、ほかにトップレベルウィンドウを作成しなかった場合は、Windowsは、新しく作成されるウィンドウの位置を画面の左上隅からの相対位置に設定します。ほかにトップレベルウィンドウを作成した場合には、Windowsはウィンドウの位置を、アプリケーションが直前に作成したばかりのトップレベルウィンドウからの相対位置に設定します。また、同様に、幅パラメータおよび高さパラメータがCW_USEDEFAULTに設定された場合は、Windowsは新しいウィンドウのサイズを計算します。ほかにトップレベルウィンドウを作成した場合には、Windowsはアプリケーションが直前に作成したばかりのトップレベルウィンドウのサイズを基に、新しいウィンドウのサイズを計算します。子ウィンドウまたはポップアップウィンドウの作成時にCW_USEDEFAULTを指定すると、Windowsはウィンドウのサイズをデフォルトの最小ウィンドウサイズに設定します。トラッキングサイズ Windowsは、WS_THICKFRAMEスタイルを持つウィンドウに対して、最大および最小のトラッキングサイズを管理しています。このスタイルを持つウィンドウは、サイズ変更境界を持ちます。「最小トラッキングサイズ」および「最大トラッキングサイズ」とは、ユーザーがウィンドウのサイズ変更境界をドラッグすることにより生成できる、最小および最大のウィンドウサイズのことです。ウィンドウの最小および最大のトラッキングサイズは、ウィンドウの作成時にシステム定義のデフォルト値が設定されます。この値は、WM_GETMINMAXINFOメッセージ処理の中で取得し、変更することができます。 システムコマンド コントロールメニュー付きのウィンドウを持つアプリケーションは、システムコマンドを送ることによってそのサイズと位置を変更できます。システムコマンドは、ユーザーがコントロールメニューからコマンドを選んだときに生成されます。アプリケーションは、ウィンドウにWM_SYSCOMMANDメッセージを送ることにより、このユーザーの操作をエミュレートすることができます。次のシステムコマンドは、ウィンドウのサイズと位置に作用します。
Z順序(配置順序) ウィンドウのZ順序(配置順序)とは、オーバーラップしているウィンドウのスタック内におけるウィンドウの重なり順序を示すものです。ウィンドウスタックは、画面上において仮想的なZ軸を考えたときに、画面から手前に向かう方向を正方向とします。Z順序でいちばん手前にあるウィンドウは、ほかのすべてのウィンドウよりも上に表示されます。また、いちばん奥にあるウィンドウは、ほかのすべてのウィンドウよりも下に表示されます。アプリケーションは、指定されたウィンドウの後ろにウィンドウを置くか、またはスタックのいちばん上かいちばん下に置くことにより、ウィンドウのZ順序を設定します。Windowsは、トップレベルウィンドウ用、兄弟ウィンドウ用、および最前面 (topmost) ウィンドウ用の、3種類のZ順序を個別に管理しています。「最前面ウィンドウ」とは、それがアクティブであるかフォアグラウンドであるかにかかわらず、最前面ウィンドウ以外のすべてのウィンドウよりも上に表示されるウィンドウのことです。最前面ウィンドウは、WS_EX_TOPMOSTスタイルを割り当てることにより作成できます。 デフォルトでは、Windowsはウィンドウの作成時にウィンドウをいちばん手前に置きます。ユーザーは別のウィンドウをアクティブにすることでZ順序を変更し、Windowsはアクティブウィンドウを常にいちばん手前に置きます。アプリケーションでウィンドウをいちばん手前に表示させるには、BringWindowToTop関数を使います。いちばん手前のウィンドウは、SetWindowPos関数またはDeferWindowPos関数を使ってZ順序を変更することができます。 サイズおよび位置を扱う関数 アプリケーションはウィンドウを作成した後、MoveWindow、SetWindowPos、DeferWindowPos、SetWindowPlacementなどのさまざまな関数を呼び出して、ウィンドウのサイズや位置を設定することができます。MoveWindow関数およびSetWindowPos関数は、いずれも単一のアプリケーションウィンドウのサイズまたは位置を設定します。SetWindowPos関数は、ウィンドウの表示状態に作用する1組のフラグを設定します。MoveWindowではこれらのフラグは設定できません。BeginDeferWindowPos、DeferWindowPos、およびEndDeferWindowPosの3つの関数は、多数のウィンドウのサイズ、位置、Z順序、および表示状態を同時に設定するために、いっしょに使われます。SetWindowPlacement関数は、1つのウィンドウのアイコン化位置、最大化位置、復元時のサイズと位置、および表示状態を設定します。 GetWindowRect関数を使えば、ウィンドウの境界長方形の座標を取得できます。GetWindowRectは、ウィンドウの左上隅および右下隅の座標をRECT構造体に設定します。設定される座標は、子ウィンドウの場合を含めて、画面左上隅からの相対座標になります。ScreenToClient関数またはMapWindowPoints関数は、子ウィンドウの境界長方形の画面座標を、親ウィンドウのクライアント領域からの相対座標に変換します。GetClientRect関数は、ウィンドウのクライアント領域の座標を取得します。GetClientRectは、クライアント領域の左上隅および右下隅の座標をRECT構造体に設定しますが、座標はクライアント領域自身からの相対座標になります。つまり、クライアント領域の左上隅の座標は常に (0, 0) になり、右下隅の座標は、クライアント領域の幅および高さになります。 サイズおよび位置を扱うメッセージ Windowsは、ウィンドウのサイズや位置が変更されようとするときに、そのウィンドウに、WM_GETMINMAXINFOメッセージを送ります。たとえば、ユーザーがコントロールメニューから[移動]コマンドまたは[サイズ変更]コマンドを選んだとき、サイズ変更境界やタイトルバーをクリックしたとき、あるいはアプリケーションがSetWindowPos関数を呼び出してウィンドウの移動やサイズ変更をしようとしたときに、WM_GETMINMAXINFOメッセージが送られます。WM_GETMINMAXINFOメッセージにはMINMAXINFO構造体を指すポインタが含まれています。この構造体には、ウィンドウの最大化時のデフォルトのサイズと位置、およびデフォルトの最小および最大のトラッキングサイズが格納されています。
アプリケーションは、WM_GETMINMAXINFOメッセージを処理し、MINMAXINFO構造体の対応するメンバを設定することにより、これらのデフォルト値を変更できます。WM_GETMINMAXINFOメッセージを受け取るには、ウィンドウがWS_THICKFRAMEスタイルまたはWS_CAPTIONスタイルを持っていなければなりません。WS_THICKFRAMEスタイルを持つウィンドウは、その作成処理の間にこのメッセージを受け取り、ウィンドウが移動またはサイズ変更されているときにも同様に受け取ります。 ウィンドウのサイズ、位置、Z順序、および表示状態を変更した後に、Windowsは、WM_WINDOWPOSCHANGEDメッセージをウィンドウに送ります。このメッセージには、WINDOWPOS構造体を指すポインタが含まれています。この構造体は、ウィンドウの新しいサイズ、位置、Z順序、および表示状態をウィンドウに通知します。WM_WINDOWPOSCHANGEDメッセージで渡されたWINDOWPOS構造体の各メンバを設定しても、ウィンドウには作用しません。WM_SIZEメッセージおよびWM_MOVEメッセージを処理しなければならないウィンドウは、必ずWM_WINDOWPOSCHANGEDメッセージを、DefWindowProc関数に渡さなければなりません。そうしない場合、WindowsはWM_SIZEメッセージおよびWM_MOVEメッセージをウィンドウに送りません。 Windowsは、ウィンドウの作成時またはサイズ変更時に、WM_NCCALCSIZEメッセージをウィンドウに送ります。Windowsはこのメッセージを使って、ウィンドウのクライアント領域のサイズ、およびクライアント座標のウィンドウの左上隅からの相対位置を計算します。通常、ウィンドウはこのメッセージをデフォルトのウィンドウプロシージャに渡します。しかし、アプリケーションでウィンドウの非クライアント領域をカスタマイズする場合や、ウィンドウのサイズ変更時にクライアント領域部分を保存する場合には、このメッセージを処理すると便利です。
|