Puteți diviza o fereastră client zona în diferite domenii funcționale utilizând windows copil. Crearea o fereastră de copil este ca crearea o fereastra principală utilizați funcția CreateWindowEx . Pentru a crea o fereastră de o clasă definită de cerere fereastră, vă trebuie să înregistreze clasa fereastra ?i să prevadă o procedură de fereastră înainte de a crea fereastra copil. Trebuie să dea fereastra copil stilul WS_CHILD și să specificați o fereastră părinte pentru fereastra copil atunci când creați o.
Următorul exemplu împarte zona client din fereastra principală o cerere în trei arii funcționale de crearea trei copil Ferestre de dimensiuni egale. Fiecare fereastră de copil este aceeași înălțime ca fereastra principală client zona, dar fiecare este o treime lățimea. Fereastra principală creează copilului windows ca răspuns la mesajul de WM_CREATE , care fereastra principală primește propriul procesul fereastra Creare. Deoarece fiecare fereastră de copil are stilul WS_BORDER, fiecare are o linie subțire bordură. De asemenea, deoarece stilul WS_VISIBLE nu este specificat, fiecare fereastră de copil este inițial ascuns. Observați, de asemenea, că fiecare fereastră de copil este atribuit un identificator de copil-fereastra.
Fereastra principală dimensiuni și poziții Ferestre copilului ca răspuns la mesajul de WM_SIZE , care fereastra principală primește atunci când se modifică dimensiunea. Ca răspuns la WM_SIZE, fereastra principală preia dimensiunile suprafe?ei sale client utilizând funcția GetWindowRect și apoi trece dimensiunile la funcția de EnumChildWindows . EnumChildWindows trece ghidajul pentru fiecare fereastră de copil, la rândul său, la funcția definită de cerere apel invers în EnumChildProc . Această funcție dimensiuni și poziționează fereastra fiecare copil sunând la funcția de MoveWindow ; dimensiunea și poziția se bazează pe dimensiunile suprafe?ei client fereastra principală și identificatorul de fereastra copil. După aceea, EnumChildProc apelează funcția ShowWindow pentru a face vizibile în fereastra.
#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;
}