Oblasti okna klienta možno rozdeliť na rôznych funkčných oblastiach pomocou podriadené okná. Vytvorenie dcérskym oknom je rád vytvára hlavného okna – môžete použiť funkciu CreateWindowEx . Vytvoriť okno definovanom aplikáciou okno triedy musí zaregistrovať triedu okna a poskytovať okno postupu pred vytvorením dcérskym oknom. Musíte dať dieťa okno WS_CHILD štýl a špecifikovať rodičovské okno pre okno dieťa, keď ju vytvoriť.
V nasledujúcom príklade rozdeľuje do klientskej oblasti hlavné okno aplikácie na troch funkčných oblastiach vytvorením troch podriadené okná rovnakej veľkosti. Každú testovaciu jamku dieťa je v rovnakej výške ako oblasti hlavného okna klienta, ale každý je jedna tretina jeho šírka. V hlavnom okne vytvorí dieťa windows v reakcii na WM_CREATE správy v hlavnom okne dostane počas svoj vlastný proces vytvárania okna. Pretože každú testovaciu jamku dieťa má WS_BORDER štýl, každý má tenké čiary orámovania. Tiež, pretože nie je zadaná v WS_VISIBLE štýle, každú testovaciu jamku dieťa je pôvodne skrytý. Všimnite si, že každú testovaciu jamku dieťa je priradený identifikátor dcérskym oknom.
V hlavnom okne veľkosti a pozície podriadené okná v reakcii na WM_SIZE správy v hlavnom okne dostane pri zmene jeho veľkosti. V reakcii na WM_SIZE, v hlavnom okne načíta rozmery oblasti svojho klienta pomocou funkcie GetWindowRect a potom prejde rozmery funkciu EnumChildWindows . EnumChildWindows prechádza rukoväť na každú jamku dieťa zasa definovanom aplikáciou EnumChildProc callback funkciou. Táto funkcia veľkosti a pozície každú testovaciu jamku dieťa volaním funkcie MoveWindow ; veľkosť a umiestnenie sú založené na rozmery hlavného okna klientskeho priestoru a identifikátor dcérskym oknom. Potom EnumChildProc zavolá funkciu ShowWindow zobrazíte okno.
#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;
}