Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
08.05.2015
Размер:
124.42 Кб
Скачать

IdFirstChild является идентификатором меню , относящимся к первому окну документа в списке документов.

Он просто равен IDM_FIRSTCHILD.

Вернемся к WinMain. Программа MDIDEMO выводит на экран только что созданное главное окно и входит в цикл обработки сообщений. Этот цикл обработки сообщений немного отличается от обычного: после получения сообщения из очереди при помощи функции GetMessage программа MDI передает сообщение функции TranslateMDISysAccel (функции TranslateAccelerator, если, как и в программе MDIDEMO, в программе также имеются быстрые клавиши меню ).

Функция TranslateMDISysAccel преобразует любые комбинации клавиш, которые могут соответствовать специальным быстрым клавишам MDI (<Ctrl>+<F6>), в сообщение WM_SYSCOMMAND. Если одна из функций TranslateMDISysAccel или TranslateAccelerator возвращает TRUE (означает, что сообщение было преобразовано одной из этих функций ), то вызова функции TranslateMessage и функции DispatchMessage не происходит.

Обратите внимание на два описателя окон, передаваемые функциям TranslateMDISysAccel и TranslateAccelerator: соответственно hwndClient и hwndFrame. Функция WinMain получает описатель окна hwndClient, используя вызов функции GetWindow с параметром GW_CHILD.

Создание дочерних окон

Часть FrameWndProc связана с обработкой сообщений WM_COMMAND, которые информируют о выборе какого – либо пункта меню. Как обычно, параметр wParam сообщения в FrameWndProc содержит идентификатор меню.

При значениях параметра wParam IDM_NEWHELLO и IDM_NEWRECT, FrameWndProc должна создать новое окно документа. Это требует инициализации полей структуры MDICREATESTRUCT (часть которых соответствует параметрам функции CreateWindow) и отправки окну – сообщения WM_MDICREATE с параметром lParam, равным указателю на эту структуру. Затем окно – создает дочернее окно документа. FrameWndProc, вызывая функцию CreateMDIWindow, могла бы сама создать это дочернее окно. Для программы, имеющей один поток, такой как MDIDEMO, можно выбрать любой из этих методов.

Как правило, поле szTitle структуры MDICREATESTRUCT является именем файла, соответствующего документу. В поле style могут быть заданы стили окна WS_HSCROLL, или WS_VSCROLL, или оба вместе, что позволяет включить в окно документа полосы прокрутки . ( ShowScrollBar для вывода полос прокрутки на экран вызывать не обязательно). В поле style могут быть также указаны стили WS_MINIMIZE или WS_MAXIMIZE для первого появления окна документа в свернутом или развернутом состоянии.

Поле lParam структуры MDICREATESTRUCT дает возможность главному и дочернему окну использовать некоторые общие переменные. Этому полю можно присвоить значение описателя памяти , соответствующего блоку памяти , содержащему структуру . При обработке сообщения WM_CREATE в дочернем окне документа , параметр lParam — это указатель на структуру CREATESTRUCT, а поле lpCreateParams этой структуры — это указатель на структуру MDICREATESTRUCT, используемую для создания окна .

При получении сообщения WS_MDICREATE окно - создает дочернее окно документа и добавляет заголовок окна к нижней части подменю, заданного в структуре MDICREATESTRUCT, которая используется для создания окна. Когда программа MDIDEMO создает свое первое окно документа, этим подменю является подменю File меню MdiMenuInit. Позже мы увидим, как этот список документов переносится в подменю Window меню MdiMenuHello и MdiMenuRect.

В меню может быть перечислено до девяти документов, перед каждым из которых ставится номер от 1 до 9. Номер подчеркивается. Если создается более девяти окон документов, то за этим списком появляется пункт меню "More windows". Выбор этого пункта вызывает появление окна диалога содержащего список, в котором перечислены все окна документов. Поддержка такого списка документов — это одно из самых лучших характеристик поддержки MDI в Windows.