Maken, opsommen en dimensionering kind Windows

U kunt het clientgebied van een venster verdelen in verschillende functionele gebieden met behulp van onderliggende vensters. Het creŽren van een onderliggend venster is als het creŽren van een hoofdvenster ó u de functie CreateWindowEx . Een venster van een toepassing gedefinieerde venster klasse maken, moet u de klasse venster registreren en bieden een venster procedure voordat u het onderliggende venster maakt. U moet geven het kind venster de WS_CHILD stijl en een bovenliggend venster voor het onderliggende venster opgeven wanneer u deze maakt.

In het volgende voorbeeld verdeelt het clientgebied van het hoofdvenster van de toepassing in drie functionele gebieden door het creŽren van drie onderliggende vensters van gelijke grootte. Elk kind venster is dezelfde hoogte als het clientgebied van het belangrijkste venster, maar elk is een derde de breedte. Het belangrijkste venster creŽert het kind windows in reactie op het bericht van de WM_CREATE , die het hoofdvenster tijdens zijn eigen venster-creatie proces ontvangt. Omdat elk kind venster de WS_BORDER stijl heeft, heeft elk een dunne rand. Ook, omdat de stijl van de WS_VISIBLE niet is opgegeven, elk kind-venster is aanvankelijk verborgen. Merk ook dat elk kind venster een subvenster id is toegewezen.

Het hoofdvenster van maten en posities van de onderliggende vensters in reactie op het bericht van de WM_SIZE , die het belangrijkste venster ontvangt wanneer de grootte verandert. In reactie op WM_SIZE, het belangrijkste venster worden de afmetingen van het clientgebied opgehaald met behulp van de functie GetWindowRect en geeft vervolgens de afmetingen aan de functie EnumChildWindows . EnumChildWindows geeft de ingang voor elk kind venster, op zijn beurt aan de toepassing gedefinieerde EnumChildProc callback functie. Deze functie maten en posities van elk kind venster door de functie MoveWindow ; de grootte en positie zijn gebaseerd op de afmetingen van het clientgebied van het belangrijkste venster en de id van het onderliggende venster. Daarna, roept EnumChildProc de functie ShowWindow naar de venster zichtbaar maken.

#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