Tips of VC++ > コントロール > ウィンドウのサイズとコントロールを連携させるには
前へ戻る次へ進む ★


ウィンドウのサイズとコントロールを連携させるには

ウィンドウのサイズ変更を可能にするには勇気がいります。 なぜなら、たいていの場合でコントロールのサイズも連携させて 動かさなければいけないからです。

原理は簡単です。ウィンドウのサイズが変更されたときに しかるべきAPIを使ってコントロールのサイズを変更します。 問題はこのときの計算が面倒なことです。
ではソースを載せます。

const int BTN_SIZE=80; // 80%だから80

case WM_SIZE:
    if ( in_wParam==SIZE_RESTORED ||
          in_wParam==SIZE_MAXIMIZED)
    {
        SIZE size;
        size.cx=LOWORD(in_lParam)*BTN_SIZE/100;
        size.cy=HIWORD(in_lParam)*BTN_SIZE/100;

        ::MoveWindow(::GetDlgItem(in_hWnd,IDC_BUTTON1),
            (LOWORD(in_lParam)-size.cx)/2,

            (HIWORD(in_lParam)-size.cy)/2,
            size.cx,size.cy,TRUE);
    }
    break;

これは、ダイアログ上のボタンが幅と高さを常に ウィンドウのクライアント領域の80%に保たれるようにしたソースです。

BOOL MoveWindow(
  HWND hWnd,      // ウィンドウのハンドル
  int X,          // 横方向の位置
  int Y,          // 縦方向の位置
  int nWidth,     // 幅
  int nHeight,    // 高さ
  BOOL bRepaint   // 再描画オプション
);

BOOL SetWindowPos(
  HWND hWnd,             // ウィンドウのハンドル
  HWND hWndInsertAfter,  // 配置順序のハンドル
  int X,                 // 横方向の位置
  int Y,                 // 縦方向の位置
  int cx,                // 幅
  int cy,                // 高さ
  UINT uFlags            // ウィンドウ位置のオプション
);

ウィンドウを移動・サイズ変更するAPIはこの二つです。 後者の方はZオーダーも変えられますし、 uFlagsの値によっては位置と幅を両方指定しなくても、 片方だけ変える事ができます。 一方、前者は常に両方の値を渡さなければなりません。 好きな方を使ってください。 私はなるべくMoveWindowを使うようにしていますが…。