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を使うようにしていますが…。