Creazione, l'enumerazione e dimensionamento finestre figlio

È possibile dividere l'area client di una finestra in diverse aree funzionali utilizzando finestre figlio. Creazione di una finestra figlio è come la creazione di una finestra principale — utilizzare la funzione CreateWindowEx . Per creare una finestra di una classe di finestra definite dall'applicazione, è necessario registrare la classe finestra e fornire una routine della finestra prima di creare la finestra secondaria. È necessario dare la finestra figlio lo stile WS_CHILD e specificare una finestra padre per la finestra del bambino quando si crea lo.

Nell'esempio seguente viene divide all'area client della finestra principale di un'applicazione in tre aree funzionali, con la creazione di tre finestre figlio di uguali dimensioni. Ogni finestra figlio è la stessa altezza area client della finestra principale, ma ciascuno è un terzo la sua larghezza. La finestra principale crea il bambino windows in risposta al messaggio WM_CREATE , che la finestra principale riceve durante il processo di creazione della finestra. Poiché ogni finestra figlio ha lo stile WS_BORDER, ognuno ha un bordo sottile linea. Inoltre, poiché non è specificato lo stile WS_VISIBLE, ogni finestra figlio viene inizialmente nascosto. Si noti inoltre che ogni finestra figlio viene assegnato un identificatore finestra figlio.

La finestra principale di dimensioni e posizioni le finestre figlio in risposta al messaggio WM_SIZE , che la finestra principale riceve quando cambia la dimensione. In risposta a WM_SIZE, la finestra principale di recupera le dimensioni dell'area client utilizzando la funzione GetWindowRect e quindi passa le dimensioni alla funzione EnumChildWindows . EnumChildWindows passa l'handle per ogni finestra figlio, a sua volta, la funzione di callback EnumChildProc definiti dall'applicazione. Questa funzione Ridimensiona e posiziona ogni finestra figlio chiamando la funzione di MoveWindow ; la dimensione e la posizione sono basati sulle dimensioni dell'area client della finestra principale e l'identificatore della finestra secondaria. In seguito, EnumChildProc chiama la funzione ShowWindow per rendere visibile la finestra.

#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; 
} 
 

Rimedio: Inserire il CD-ROM CD di MSDN Library.

Index