Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО / Лекции / КурсЛекций.doc
Скачиваний:
94
Добавлен:
23.02.2015
Размер:
8.22 Mб
Скачать

Работа с дочерними окнами

Вы можете разделить клиентскую область окна на различные функциональные области с помощью дочерних окон. Создание дочернего окна напоминает создание главного окна: Вы должны использовать функцию CreateWindowEx(). Чтобы создать окно определенного приложением класса окна (application-defined window class), Вы должны зарегистрировать класс окна и указать функцию окна перед созданием самого дочернего окна. Для дочернего окна Вы должны задать стиль WS_CHILD. Кроме того, при создании дочернего окна для него необходимо указать родительское окно.

В приведенном ниже примере клиентская область главного окна приложения делится на три функциональных области путем создания трех дочерних окон одинакового размера. Каждое дочернее окно имеет ту же высоту, что и клиентская область главного окна, но занимает только третью часть его ширины. Главное окно создает дочерние окна при получении сообщения WM_CREATE (которое оно получает в процессе своего собственного создания). Поскольку каждое дочернее окно имеет стиль WS_BORDER, его граница представляет собой тонкую линию. Кроме того, поскольку не определен стиль WS_VISIBLE, каждое дочернее окно изначально является скрытым. Также обратите внимание, что каждому дочернему окну назначается собственный идентификатор.

Главное окно изменяет размеры и расположение дочерних окон при получении сообщения 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: // 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(hwndChild, lParam) 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; }