アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

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;
メンバ 説明
ptReserved 内部使用のために予約されています。
ptMaxSize ウィンドウの最大化時の幅 (point.x) と高さ (point.y) を指定します。
ptMaxPosition ウィンドウの最大化時の左端の位置 (point.x) と上端の位置 (point.y) を指定します。
ptMinTrackSize ウィンドウの最小トラッキングサイズの幅 (point.x) と高さ (point.y) を指定します。
ptMaxTrackSize ウィンドウの最大トラッキングサイズの幅 (point.x) と高さ (point.y) を指定します。

 最大化の時のウィンドウをスクリーン一杯にせずに、制限したいときは、ptMaxPositionに左上の位置と設定し、ptMaxSizeにウィンドウのサイズを設定します。リサイズ操作でウィンドウの最小のサイズを制限するときは、ptMinTrackSizeに最低値を設定します。またリサイズ操作でウィンドウの最大のサイズを制限するときは、ptMaxTrackSizeに最大値を設定します。
 リサイズで、縦方向だけリサイズを許して、横は固定にする場合は、ptMinTrackSize.x と、ptMaxTrackSize.x に固定の横の幅を設定します。

ウィンドウの最小のサイズを制限する

 以下のコードの例は、ウィンドウの最小の横サイズを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;
}

ページ移動