Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы


Листинг 1.1. Файл mdiapp/mdiapp.cpp - часть 7


Для удаления окна Document Window окну Client Window посылается сообщение WM_MDIDESTROY, для чего вызывается функция SendMessage.

После завершения цикла удаления окно Client Window вновь делается видимым при помощи функции ShowWindow с параметром SW_SHOW.

Перед тем как вызвать функцию DefFrameProc, обработчик сообщения WM_COMMAND посылает это же сообщение активному окну Document Window. Так как пользователь может сделать активным любое окно Document Window, сначала нужно определить идентификатор активного окна. Это можно сделать, если послать окну Client Window сообщение WM_MDIGETACTIVE:

HWND hwndChild = (HWND)LOWORD(SendMessage(hwndClient, WM_MDIGETACTIVE, 0, 0l));

Функция SendMessage вернет идентификатор активного окна Document Window. После проверки этого идентификатора функцией IsWindow можно посылать сообщение в активное окна Document Window:

if(IsWindow(hwndChild)) SendMessage(hwndChild, WM_COMMAND, wParam, lParam);

В завершении своей работы обработчик сообщения WM_COMMAND обязан вызвать функцию DefFrameProc:

return DefFrameProc(hwnd, hwndClient, msg, wParam, lParam);

Заметьте, что этой функции нужно указать в первом параметре идентификатор окна Frame Window, а в качестве второго - идентификатор окна Client Window. Остальные параметры аналогичны параметрам функции DefWindowProc.

Теперь займемся функцией окна Document Window.

В нашем простейшем MDI-приложении эта функция делает только одну вещь - при обработке сообщения WM_PAINT пишет в центре окна Document Window текстовую строку "Child Window", вызывая для этого функцию DrawText:

LRESULT CALLBACK _export ChildWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rc; switch (msg) { case WM_PAINT: { hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rc); DrawText(hdc, "Child Window", -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); } default: break; } return DefMDIChildProc(hwnd, msg, wParam, lParam); }

Все сообщения, обработанные и необработанные, эта функция передает функции DefMDIChildProc, параметры которой аналогичны параметрам функции DefWindowProc.

Идентификаторы строк меню приложения MDIAPP определены в файле mdiapp.hpp (листинг 1.2).




Начало  Назад  Вперед



Книжный магазин