Você pode dividir a área cliente da janela em diferentes áreas funcionais, usando janelas filho. Criar uma janela filho é como criar uma janela principal — você usa o CreateWindowEx função. Para criar uma janela de uma classe janela application-defined, você deve registrar a classe janela e fornecer um procedimento janela antes de criar a janela filho. Você deve dar a janela filho o estilo estilo e especificar uma janela pai para a janela filho ao criá-lo.
O exemplo a seguir divide a área cliente da janela principal do aplicativo em três áreas funcionais, criando três janelas filho de tamanho igual. Cada janela filho é a mesma altura que a área cliente da janela principal, mas cada um é de um terço de sua largura. A janela principal cria o filho windows em resposta à mensagem WM_CREATE , que a janela principal recebe durante seu próprio processo de criação da janela. Como cada janela filho não tem o estilo WS_BORDER, cada um tem uma borda de linha fina. Também, porque o estilo WS_VISIBLE não é especificado, cada janela filho está inicialmente oculto. Observe também que cada janela filho recebe um identificador de janela filho.
A janela principal dimensiona e posiciona o filho windows em resposta à mensagem WM_SIZE , que a janela principal recebe quando seu tamanho se altera. Em resposta a WM_SIZE, janela principal recupera as dimensões da sua área de cliente, usando a função GetWindowRect e, em seguida, passa as dimensões para a função EnumChildWindows . EnumChildWindows passa o identificador para cada janela filho, por sua vez, para a função de retorno de chamada definido pelo aplicativo EnumChildProc . Essa função tamanhos e posições de cada janela filho chamando a função MoveWindow ; o tamanho e a posição baseiam-se sobre as dimensões da área cliente da janela principal e o identificador da janela filho. Depois, EnumChildProc chama a função ShowWindow para tornar a janela visível.
#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;
}