Прикрепление дочернего окна к родительскому окну - PullRequest
1 голос
/ 21 февраля 2011

Мне нужно, чтобы мои 6 элементов управления (дочерние окна главного окна) стали больше, когда основное окно изменяется пользователем (перетаскивая углы). Я думал, что мог бы сделать это, используя функцию MoveWindow, чтобы изменить пропорции каждого дочернего элемента в функции WM_SIZE или WM_SIZING главного окна. Это сделало сборку Debug странной (несколько окон, изображение окна, торчащее после выхода и т. Д.). Сборка Release работала нормально, но дочерние окна не изменились, когда я изменил размер главного окна.

Я обнаружил, http://msdn.microsoft.com/en-us/library/ms632598%28v=VS.85%29.aspx#creating_enumerating_etc использовал другой способ сделать это: путем перечисления всех дочерних окон и функции обратного вызова enum, обрабатывающей изменение размера окна посредством уникального идентификатора, назначенного каждому дочернему элементу. После того, как я попробовал это сам, это не имело никакого значения для элементов управления при изменении размера главного окна.

Почему это не работает?

В операторе переключения основных окон:

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;
    }
}

1 Ответ

4 голосов
/ 21 февраля 2011

Из Статья MSDN по WM_SIZE : «Если функция SetScrollPos или MoveWindow вызывается для дочернего окна в результате сообщения WM_SIZE, параметр bRedraw или bRepaint должен быть ненулевым, чтобы окно былоперекрасили «.Я подозреваю, что дочерние элементы управления перемещаются, они просто не перекрашиваются.

Возможно, также стоит проверить, что на ваши переключатели действительно попали.

Редактировать: Я пропустил очевидное.Вы отвечаете на WM_SIZING, который указывает, что размер окна собирается (но еще не изменился).WM_SIZE указывает, что размер изменился.Если вы хотите использовать WM_SIZING, вам нужно использовать прямоугольник, переносимый в lParam, а не результаты GetClientRect.К сожалению, прямоугольник WM_SIZING является прямоугольником окна, а не клиентской областью, и находится в экранных координатах.Если вам действительно не нужно отображать элементы управления с измененным размером, когда пользователь все еще выполняет изменение размера, было бы намного проще просто обработать сообщение WM_SIZE.

...