|
|
||||||||||||
|
2-2-6. ウィンドウのサイズを制限するウィンドウによっては、これ以上小さくしては困ることもあります。または縦方向はサイズを変更したいが、横方向は固定サイズにしたい場合があります。さらに最大化でスクリーン一杯に表示されては困る場合も考えられます。ここでは、ウィンドウのリサイズでのサイズを制御する方法を考えます。WM_GETMINMAXINFOメッセージ WM_GETMINMAXINFOメッセージは、ウィンドウのサイズまたは位置を変更しようとしているときに、そのウィンドウに送られます。アプリケーションは、ウィンドウのデフォルトの最大サイズと、位置やデフォルトの最大または最小トラッキングサイズを無効にするときに、このメッセージを使うことができます。最大トラッキングサイズとは、境界を使用して変更できる最大のウィンドウサイズのことです。最小トラッキングサイズとは、境界を使用して変更できる最小のウィンドウサイズのことです。このメッセージの lParam パラメータは、MINMAXINFO構造体を指すポインタです。この構造体には、 デフォルトの最大位置と寸法、 およびデフォルトの最小または最大トラッキング サイズが格納されます。アプリケーションは、 この構造体のメンバを設定することによって、 デフォルトを無効にすることができます。このメッセージを処理するアプリケーションは、 0を返さなければなりません。 MINMAXINFO 構造体の内容 MINMAXINFO 構造体は、ウィンドウの最大化時のサイズと位置、および最大化時とアイコン化時のトラッキングサイズに関する情報を格納します。typedef struct tagMINMAXINFO { /* mmi */
POINT ptReserved;
POINT ptMaxSize;
POINT ptMaxPosition;
POINT ptMinTrackSize;
POINT ptMaxTrackSize;
} MINMAXINFO;
最大化の時のウィンドウをスクリーン一杯にせずに、制限したいときは、ptMaxPositionに左上の位置と設定し、ptMaxSizeにウィンドウのサイズを設定します。リサイズ操作でウィンドウの最小のサイズを制限するときは、ptMinTrackSizeに最低値を設定します。またリサイズ操作でウィンドウの最大のサイズを制限するときは、ptMaxTrackSizeに最大値を設定します。 ウィンドウの最小のサイズを制限する 以下のコードの例は、ウィンドウの最小の横サイズを300ドットに制限します。つまりウィンドウの横は、300ドットより小さくなりません。LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg
,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
: (他のメッセージ)
case WM_GETMINMAXINFO:
{
LPMINMAXINFO lpmmi;
lpmmi = (LPMINMAXINFO)lParam;
lpmmi->ptMinTrackSize.x = 300;
return 0;
}
: (他のメッセージ)
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
上のコードの例は、ウィンドウプロシージャの場合で、対象のウィンドウはアプリケーションのメインウィンドウです。ではダイアログボックスを制限する方法を説明します。強調部分が上のコードと違います。ダイアログボックスのプロシージャの場合は、返り値は、DWL_MSGRESULT 値で、SetWindowLong 関数をコールすることで設定します。
BOOL CALLBACK DlgProc(HWND hDlg,UINT uMsg
,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
: (他のメッセージ)
case WM_GETMINMAXINFO:
{
LPMINMAXINFO lpmmi;
lpmmi = (LPMINMAXINFO)lParam;
lpmmi->ptMinTrackSize.x = 300;
SetWindowLong(hDlg,DWL_MSGRESULT,0);
return TRUE;
}
: (他のメッセージ)
}
return FALSE;
}
|