FAQ3-2

Q. 縦方向にのみサイズ変更可能なウィンドウを作るには

 サイズ変更可能なオーバーラップウィンドウは,必ず縦方向にも横方向にもサイズ変更できますが,これを,縦方向のみにサイズ変更できるようにできないものでしょうか?
 とりあえず,WM_SIZEが来たときにMoveWindowとかして調整しているのですが,できればサイズ変更中の枠は横方向には動かないようにしたいです.


A. WM_GETMINMAXINFOメッセージに応答する

 WM_GETMINMAXINFOメッセージに応答することで,サイズ変更できる最少の大きさと最大の大きさなどを変更することができます.
 これを利用して,縦方向にのみサイズ変更可能なウィンドウが作成できます.
 このメッセージは,SDKヘルプを見ても,よくわからない説明が書かれているのであまり知られていないようですが,使ってみると図3-5のようになります.

[図3-5] :

 WM_GETMINMAXINFOが来たときlParamにMINMAXINFO構造体へのポインタが入っているので,その先の値を変えてやることで,図3-5のようなことになります.図3-5は,MINMAXINFO構造体の中身をいろいろ変えてみた例です.
 この値を,リスト3-4のようにすると,縦サイズのみ変更可能なように見えます.なぜそうなるのかというと,ptMinTrackSizeとptMaxTrackSizeの幅を同じにしているので,横方向に動かそうとしても,大きくもできず,小さくもできず,サイズ変更の枠はぜんぜん動かせなくなってしまうからです.
 もう一つ考えられる方法で,WM_NCHITTESTメッセージを利用する方法も考えられますが,ややこしくなるのでWM_GETMINMAXINFOを使う方法でいいでしょう.

[リスト3-4] :

  case WM_GETMINMAXINFO :{
    MINMAXINFO FAR * lpmmi;
    lpmmi = (MINMAXINFO FAR *)lParam;
    lpmmi->ptMaxSize.x = 0;        /*最大表示時の位置*/
    lpmmi->ptMaxSize.y = 0;
    lpmmi->ptMaxPosition.x = 640;  /*最大表示時の大きさ*/
    lpmmi->ptMaxPosition.y = 480;
    lpmmi->ptMinTrackSize.x = 300; /*最小のサイズ変更できる大きさ*/
    lpmmi->ptMinTrackSize.y = 100;
    lpmmi->ptMaxTrackSize.x = 300; /*最大のサイズ変更できる大きさ*/
    lpmmi->ptMaxTrackSize.y = 700;
    return(0);
    }

Back to FAQ main page