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


Вы можете поделить внутри рабочую область окна на функционально-различные области, используя дочерние окна. Для создания дочернего окна, подобно созданию основного окна, Вы используете функцию 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 hwnd, UINT uMsg, WPARAM wParam, LPARAM 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(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;
}

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz