Створення, перелічення та калібрування дитини Windows

Клієнтської області у вікні можна розділити на різні функціональні зони, за допомогою windows дитини. Створення дочірнього вікна, як створення головне вікно — ви використовувати функцію CreateWindowEx . Створити вікно клас визначений у застосунку вікно, ви повинні зареєструвати клас вікна і забезпечити вікні процедуру до створення дочірнього вікна. Ви повинні дати дитини вікні стиль WS_CHILD і вказати батьківського вікно для дочірнього вікна під час його створення.

Наступний приклад ділить клієнтської області головне вікно програми на три функціональних областей, створюючи три дитини windows однакового розміру. Кожна дитина вікно тій же висоті, у головному вікні клієнтської області, але кожен однієї третини його ширину. У головному вікні створює дитини 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