Создание, перечисления и размеров дочерних окон

Клиентской области окна можно разделить на различные функциональные области с помощью дочерних окон. Создание дочернего окна, как создание главного окна — используется функция CreateWindowEx . Чтобы создать окно класса окна, определяемые приложением, необходимо зарегистрировать класс окна и обеспечить процедуру окна перед созданием дочернего окна. Необходимо дать дочернее окно в WS_CHILD стиле и указать родительского окна для дочернего окна при его создании.

Следующий пример делит клиентской области главного окна приложения на три функциональные области путем создания трех дочерних окон одинакового размера. Каждое дочернее окно является той же высоте, что главного окна клиентской области, но каждый одну треть его ширину. Главное окно создает дочерние windows в ответ на WM_CREATE сообщение, которое основное окно получает в ходе процесса создания окна. Так как каждое дочернее окно в WS_BORDER стиле, каждая имеет тонкие линии границы. Кроме того потому что не указан стиль WS_VISIBLE, каждое дочернее окно изначально скрыто. Обратите внимание, что каждое дочернее окно присваивается идентификатор дочернего окна.

Главное окно размеров и позиций дочерних окон в ответ на WM_SIZE сообщение, которое получает главное окно при изменении его размера. В ответ на WM_SIZE главное окно извлекает размеры клиентской области, используя функцию GetWindowRect и затем передается функции EnumChildWindows измерения. EnumChildWindows передает дескриптор для каждого дочернего окна, в свою очередь, определяется приложением EnumChildProc функции обратного вызова. Эта функция изменяет размеры и положения каждого дочернего окна путем вызова функции MoveWindow ; размер и положение основаны на размеры клиентской области главного окна и идентификатор дочернего окна. После этого EnumChildProc вызывает функцию ShowWindow для отображения окна.

#define ID_FIRSTCHILD  100 
#define ID_SECONDCHILD 101 
#define ID_THIRDCHILD  102 
 
LONG APIENTRY MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    RECT rcClient; 
    int i; 
 
    switch(uMsg) 
    { 
        case WM_CREATE: // creating main window  
 
            // Create three invisible child windows. 
 
            for (i = 0; i < 3; i++) 
            { 
                CreateWindowEx( 
                    0, 
                    "ChildWClass", 
                    (LPCTSTR) NULL, 
                    WS_CHILD | WS_BORDER, 
                    0,0,0,0, 
                    hwnd, 
                    (HMENU) (int) (ID_FIRSTCHILD + i), 
                    hinst, 
                    NULL); 
            }
 
            return 0; 
 
        case WM_SIZE:   // main window changed size 
 
            // Get the dimensions of the main window's client 
            // area, and enumerate the child windows. Pass the 
            // dimensions to the child windows during enumeration. 
 
            GetClientRect(hwnd, &rcClient); 
            EnumChildWindows(hwnd, EnumChildProc, 
                (LPARAM) &rcClient); 
            return 0; 
        // Process other messages. 
 
    } 
    return DefWindowProc(hwnd, uMsg, wParam, lParam); 
} 
 
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) 
{ 
    LPRECT rcParent; 
    int i, idChild; 
 
    // Retrieve the child-window identifier. Use it to set the 
    // position of the child window. 
 
    idChild = GetWindowLong(hwndChild, GWL_ID); 
 
    if (idChild == ID_FIRSTCHILD) 
        i = 0; 
    else if (idChild == ID_SECONDCHILD) 
        i = 1; 
    else 
        i = 2; 
 
    // Size and position the child window.  
 
    rcParent = (LPRECT) lParam; 
    MoveWindow(hwndChild, 
        (rcParent->right / 3) * i, 
        0, 
        rcParent->right / 3, 
        rcParent->bottom, 
        TRUE); 
 
    // Make sure the child window is visible. 
 
    ShowWindow(hwndChild, SW_SHOW); 
 
    return TRUE; 
} 
 

Index