Erstellen, aufzählen und Größenänderung von untergeordneten Fenster

Clientbereich eines Fensters kann mithilfe von untergeordneten Fenster in verschiedene Funktionsbereiche aufgeteilt werden. Erstellen eines untergeordneten Fensters ist wie ein Hauptfenster erstellt — verwenden Sie die CreateWindowEx -Funktion. Um ein Fenster über eine anwendungsdefinierte Fensterklasse zu erstellen, müssen Sie die Fensterklasse registrieren und bieten eine Fensterprozedur vor Erstellen des untergeordneten Fensters. Sie müssen dem untergeordnete Fenster geben Sie das Format WS_CHILD und ein übergeordnete Fenster für das untergeordnete Fenster angeben, wenn Sie es erstellen.

Das folgende Beispiel teilt den Clientbereich des Hauptfensters einer Anwendung in drei Funktionsbereiche durch Erstellen drei untergeordnete Fenster gleicher Größe. Jede untergeordnete Fenster ist die gleiche Höhe wie das Hauptfenster Clientbereich, aber jeder ist ein Drittel seiner Breite. Das Hauptfenster erstellt die untergeordneten Windows als Reaktion auf die Nachricht WM_CREATE , die Hauptfenster während seiner eigenen Fenster-Erstellungsprozesses erhält. Da jedes Kindfenster die Formatvorlage WS_BORDER hat, besitzt jedes eine dünne Rahmenlinie. Da der Style WS_VISIBLE nicht angegeben ist, ist auch jede untergeordnete Fenster anfänglich ausgeblendet. Beachten Sie auch, dass jedes Kindfenster einen ChildWindow Bezeichner zugewiesen wird.

Das Hauptfenster Größen und Positionen der untergeordneten Fenster in Reaktion auf die WM_SIZE -Nachricht, die im Hauptfenster erhält, wenn seine Größe ändert. In Reaktion auf die WM_SIZE das Hauptfenster Ruft die Abmessungen des Clientbereichs mit die GetWindowRect -Funktion und übergibt dann die Dimensionen der EnumChildWindows -Funktion. EnumChildWindows übergibt das Handle an jedes untergeordnete Fenster, wiederum an die anwendungsdefinierte Rückruffunktion für EnumChildProc . Diese Funktion wird die Größe und Positionen jedes untergeordnete Fenster durch Aufrufen der Funktion MoveWindow ; die Größe und Position basieren auf die Abmessungen des Clientbereichs des Hauptfensters und die ID des untergeordneten Fensters. Danach ruft EnumChildProc die Funktion ShowWindow das Fenster sichtbar machen.

#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