สร้าง กำลังระบุต่าง ๆ และการปรับขนาด 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