Win32 API. Окна - Создание, перечисление и изменение размеров дочерних окон

ОГЛАВЛЕНИЕ

 

Создание, перечисление и изменение размеров дочерних окон

Вы можете поделить рабочую область окна на функционально-различные области, используя дочерние окна. Для создания дочернего окна, подобно созданию основного окна, Вы используете функцию CreateWindowEx. Чтобы создать окно определенного прикладной программой класса окна, Вы должны зарегистрировать класс окна и предоставить оконную процедуру перед созданием дочернего окна. Вы должны дать дочернему окну стиль WS_CHILD и определить родительское окно для дочернего окна, когда его создаете.
Следующий пример делит рабочую область основного окна прикладной программы на три функциональные области, создавая три дочерних окна равного размера. Каждое дочернее окно имеет ту же самую высоту, что и рабочая область основного окна, однако каждое - третья часть его ширины. Основное окно создает дочерние окна в ответ на сообщение 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, uMsg, wParam, lParam)
HWND hwnd;
UINT uMsg;
UINT wParam;
LONG lParam;
{
RECT rcClient;
int i;
switch(uMsg)
{
case WM_CREATE: // создание основного окна
// Создание трех невидимых дочерних окна
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: // изменение размеров основного окна
// Получает габариты рабочей области главного окна и перечисляет дочерние окна.
// Передает габариты в дочерние окна в ходе перечисления.
GetClientRect(hwnd, &rcClient);
EnumChildWindows(hwnd, EnumChildProc,(LPARAM) &rcClient);
return 0;

// Создание других сообщений.
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

BOOL CALLBACK EnumChildProc(hwndChild, lParam)
HWND hwndChild;
LPARAM lParam;
{
LPRECT rcParent;
int i, idChild;
// Восстановление идентификатора дочернего окна.
// Использовать его для установки дочернего окна.

idChild = GetWindowLong(hwndChild, GWL_ID);
if (idChild == ID_FIRSTCHILD)
i = 0;
else if (idChild == ID_SECONDCHILD)
i = 1;
else
i = 2;
// Размер и позиция дочернего окна.
rcParent = (LPRECT) lParam;
MoveWindow(hwndChild, (rcParent->right / 3) * i,0, rcParent->right / 3,rcParent->bottom,TRUE);
// Удостоверитесь, что дочернее окно видимо
ShowWindow(hwndChild, SW_SHOW);
return TRUE;
}