Как я могу обработать изменение размера дочерних окон при изменении размеров родительских окон? - PullRequest
0 голосов
/ 03 ноября 2019

Так что я пытался сделать это немного сейчас. У меня проблемы с обработкой изменения размера дочерних окон при изменении размера родительского окна. Когда я не обрабатываю изменение размера, родительское окно изменяется, и дочерние окна остаются в том же месте.

Я знаю, что это должно быть в сообщении WM_SIZE, но я не знаю, как обращаться состальное оттуда. Я пытался использовать функции MoveWindow () и UpdateWindow (), но мне это не помогло.

Я пытался заставить этот дочерний элемент окна правильно изменить размер: hName = CreateWindowW(L"Edit", L"", WS_CHILD | WS_VISIBLE | WS_BORDER, 200, 50, 98, 38, hWnd, NULL, NULL, NULL);. Пока ничего не получилось. Помощь приветствуется! Спасибо!

1 Ответ

1 голос
/ 04 ноября 2019

Я использую глобальный RECT для хранения левого, верхнего, ширины и высоты элемента управления «Правка» (RECT editSize = { 100, 50 , 100, 100 }). В WM_SIZE сообщении позвоните EnumChildWindows, измените размер моего дочернего окна в EnumChildProc

case WM_SIZE:
        GetClientRect(hWnd, &rcClient);
        EnumChildWindows(hWnd, EnumChildProc, (LPARAM)&rcClient);
        return 0;

EnumChildProc:

#define ID_Edit1  200 

...

BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
    int idChild;
    idChild = GetWindowLong(hwndChild, GWL_ID);
    LPRECT rcParent;
    rcParent = (LPRECT)lParam;

    if (idChild == ID_Edit1) {

        //Calculate the change ratio
        double cxRate = rcParent->right * 1.0 / 884; //884 is width of client area
        double cyRate = rcParent->bottom * 1.0 / 641; //641 is height of client area

        LONG newRight = editSize.left * cxRate;
        LONG newTop = editSize.top * cyRate;
        LONG newWidth = editSize.right * cxRate;
        LONG newHeight = editSize.bottom * cyRate;

        MoveWindow(hwndChild, newRight, newTop, newWidth, newHeight, TRUE);

        // Make sure the child window is visible. 
        ShowWindow(hwndChild, SW_SHOW);
    }
    return TRUE;
}

enter image description here

enter image description here

...