ユーザーがメイン ウィンドウのサイズを変更する (コーナーをドラッグする) ときに、6 つのコントロール (メイン ウィンドウの子ウィンドウ) を大きくする必要があります。MoveWindow 関数を使用して、メイン ウィンドウの WM_SIZE または WM_SIZING 関数で各子の比率を変更することで、これを達成できると考えました。これを行うと、デバッグ ビルドがおかしくなりました (複数のウィンドウ、終了後にウィンドウの画像が動かなくなるなど)。リリース ビルドは正常に実行されましたが、メイン ウィンドウのサイズを変更しても子ウィンドウは変更されませんでした。
http://msdn.microsoft.com/en-us/library/ms632598%28v=VS.85%29.aspx#creating_enumerating_etcがこれを行う別の方法を使用していることがわかりました: すべての子ウィンドウを列挙し、enum コールバックすべての子に割り当てられた一意の ID を介してウィンドウのサイズ変更を処理する関数。これを自分で試してみると、メイン ウィンドウのサイズが変更されたときにコントロールに違いはありませんでした。
なぜこれが機能しないのですか?
メイン ウィンドウの switch ステートメントでは、次のようになります。
case WM_SIZING:
GetClientRect(hwnd, &hwndRect);
EnumChildWindows(hwnd, EnumChildProc, (LPARAM)&hwndRect);
break;
子列挙子のコールバック関数:
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
LPRECT hwndRect = (LPRECT)lParam;
switch(GetWindowLong(hwndChild, GWL_ID))
{
case ID_CHILD_LLABEL:
MoveWindow(hwndChild, 0, 0, (hwndRect->right - hwndRect->left) - 30, 20, false);
break;
case ID_CHILD_LDIR:
MoveWindow(hwndChild, 12, 20, (hwndRect->right - hwndRect->left) - 40, 20, false);
break;
case ID_CHILD_LLIST:
MoveWindow(hwndChild, 12, 40, (hwndRect->right - hwndRect->left) - 40, (hwndRect->bottom - hwndRect->top) - 238, false);
break;
}
}