יצירת, ספירת ושינוי גודל של חלונות צאצאים

באפשרותך לחלק אזור הלקוח של חלון לאזורים פונקציונליים שונים באמצעות חלונות צאצאים. יצירת חלון צאצא דומה ליצירת החלון הראשי — באפשרותך להשתמש בפונקציה 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