คุณสามารถแบ่งพื้นที่ของไคลเอ็นต์ของหน้าต่างลงในพื้นที่ทำงานที่แตกต่างกันได้ โดยใช้ 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;
}