Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы© Александр Фролов, Григорий ФроловТом 17, М.: Диалог-МИФИ, 1994, 287 стр. 1.9. Работа с окнами Document WindowВ этом разделе мы кратко рассмотрим некоторые дополнительные вопросы, возникающие при создании MDI-приложений. Мы расскажем о безопасном способе уничтожения окон Document Window, о динамическом изменении главного меню приложения и о том, как идентифицировать окна Document Window. Безопасное уничтожение окон Document WindowТак как MDI-приложения могут работать одновременно с несколькими документами, следует соблюдать осторожность при уничтожении окон Document Window, которые используются для редактирования документов, а также при завершении работы приложения. Необходимо убедиться, что пользователь сохранил все измененные документы в соответствующих файлах. Обычный способ заключается в использовании сообщения WM_QUERYENDSESSION, о котором мы уже рассказывали в предыдущих томах "Библиотеки системного программиста". Напомним, что это сообщение посылается всем приложениям при завершении работы операционной системы Windows. Если приложение может завершить свою работу, в ответ на это сообщение оно должно возвратить значение TRUE. Если же будет возвращено значение FALSE, завершение работы Windows будет отменено. Большинство приложений, редактирующих документы, реагируют на сообщение WM_QUERYENDSESSION следующим образом. Если пользователь не загружал документы или не изменил ни один из загруженных документов, обработчик сообщения WM_QUERYENDSESSION (который находится в функции окна Frame Window) возвращает значение TRUE, разрешая завершение Windows. Если же один или несколько из загруженных документов был изменен, но не сохранен, обработчик предлагает пользователю сохранить документ, или отказаться от сохранения документа. Аналогичные действия выполняются и при завершении работы приложения в обработчике сообщения WM_CLOSE. Для проверки возможности уничтожения окна Document Window лучше всего послать ему сообщение WM_QUERYENDSESSION, предусмотрев в функции окна Document Window соответствующий обработчик. Этот обработчик проверяет, нужно ли сохранять документ, связанный с данным окном Document Window, и при необходимости предлагает пользователю сохранить документ или отказаться от сохранения. Если функция SendMessage, с помощью которой было послано сообщение WM_QUERYENDSESSION, возвратила значение TRUE, данное окно можно уничтожать. Аналогичные проверки требуется выполнять в обработчике сообщения для строки "Close All" меню "Window", так как в противном случае могут быть потеряны результаты работы по редактированию одного или нескольких документов. Динамическое изменение главного меню приложенияОкна Document Window MDI-приложения могут содержать документы различных типов либо документы одного и того же типа, но находящиеся в различном состоянии. Поэтому в зависимости от того, какое окно Document Window активно, внешний вид главного меню приложения (и органов управления окна Toolbar, если такое предусмотрено в приложении) должно изменяться. О том, как динамически изменять меню, мы рассказывали в первой главе 13 тома "Библиотеки системного программиста". Теперь нам надо научиться выполнять такие изменения при активизации окон Document Window. Функция окна Document Window может обнаружить, когда окно становится активным (получает фокус ввода) или неактивным (теряет фокус ввода), отслеживая сообщение WM_MDIACTIVATE. Параметр wParam этого сообщения принимает значение TRUE, если окно Document Window становится активным, или FALSE, если оно становится неактивным. Если окно становится активным, младшее слово параметра lParam сообщения WM_MDIACTIVATE содержит идентификатор активного окна Document Window. Если же окно теряет фокус ввода и становится неактивным, старшее слово параметра lParam сообщения WM_MDIACTIVATE содержит идентификатор окна Document Window, которое становится неактивным. Предусмотрев в функции окна Document Window обработчик сообщения WM_MDIACTIVATE, приложение может изменять главное меню приложения и выполнять другие действия в зависимости от того, какое окно Document Window стало активным. Идентификация окон Document WindowОбычно приложение связывает с каждым окном Document Window определенную структуру, в которой хранятся сведения о содержимом и состоянии каждого конкретного экземпляра окна Document Window. При регистрации класса окна Document Window вы можете использовать поле cbClsExtra структуры WNDCLASS, определив в нем место, достаточное для хранения указателя на структуру, содержащую перечисленную выше информацию. Эта структура должна инициализироваться каждый раз при создании нового окна Document Window. Для записи адреса структуры в память, зарезервированную для окна, используйте функцию SetWindowLong. Для доступа к структуре в этом случае можно вызвать функцию GetWindowLong. Если вы получаете память для структуры
динамически, не забывайте отдавать ее системе
при уничтожении окна Document Window. |