Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции -Процедурное программирование в Windows.doc
Скачиваний:
13
Добавлен:
13.09.2019
Размер:
742.91 Кб
Скачать

Сообщение wm_destroy

Это сообщение Windows посылает функции окна сразу же после закрытия окна. При получении его функция окна должна завершить свою работу и, если это функция главного окна приложения, обязательно послать в очередь приложения сообщение WM_QUIT.

Функция окна должна обработать сообщение WM_DESTROY следующим образом:

case WM_DESTROY: PostQuitMessage(NUUL);

break;

Функция PostQuitMessage() помещает сообщение WM_QUIT в очередь приложения. Когда функция GetMessage() извлечет это сообщение из очереди приложения, произойдет выход из цикла обработки сообщений и приложение совершит свою работу.

Функция окна получает сообщения из цикла обработки сообщений и от Windows. Из цикла обработки сообщений поступают сообщения ввода: перемещение и нажатие клавиш мыши (сообщения WM_MOUSEMOVE ,WM_LBUTTONDOWN и др.), нажатие и отпускание клавиш клавиатуры (WM_KEYDOWN и WM_ KEYUP) и, если установлен генератор событий таймера, сообщения от таймера (WM_TIMER).

Windows посылает функции окна сообщения поддержки окна напрямую, минуя очередь приложения и цикл обработки сообщений. Эти сообщения обычно вызваны событиями, требующими немедленной реакции по изменению вида окна, например, перерисовки изображения при изменении размеров окна пользователем или из-за взаимодействия с другими окнами. Эти сообщения могут служить также средством обмена информацией между Windows и приложением, сообщающим об изменении в среде Windows или о том, что Windows сделал с окном приложения. Типичными системными сообщениями окна являются, например, сообщения WM_CREATE, WM_DESTROY и WM_PAINT.

Если функция окна не обрабатывает сообщение, то необходимо передать управление функции DefWindowProc() и вернуть возвращенное ей значение.

О к н а Windows

Существует всего лишь три основных окон Windows.

Перекрывающиеся окна.

Флаг WS_OVERLAPPED. Это основной наиболее универсальный тип окна Windows. Главное, самое старшее, окно приложения, как правило, имеет именно этот тип.

Дочерние окна.

Флаг WS_CHILD. Окна этого типа, как правило, создаются тогда, когда у приложения уже есть главное(а значит, перекрывающееся) окно. Окно этого типа связано некоторыми характеристиками (как бы подчинено) с тем окном, из которого было создано дочернее окно; отсюда их название. Назначение этих окон может быть самое разнообразное, начиная от простого деления родительского окна на области до организации Много Документального Интерфейса (MDI - Multiple Document Interface). Все органы управления также являются дочерними окнами (child window controls).

Вспомогательные окна.

Флаг WS_POPUP. Этот тип окон чаще всего используется для отображения окон диалога. Отличаются они тем, что, если имеют родительское окно, всегда отображаются поверх всех окон на экране, выскакивают как поплавки наверх даже тогда, когда пользователь делает активным другое окно.

Из трех основных типов (классов) окон программист может создать множество самых разнообразных объектов.

Тип окна задается 32-битовым беззнаковым целым числом, которое указывается третьим параметром вызова функции CreateWindow. Этот параметр интерпретируется как комбинация битовых флагов, определяющих тип окна и некоторые его свойства. Допустимые флаги типов окна определены в файле windows.h; при создании окна их можно комбинировать битовой операцией «ИЛИ» («|»).

WS_MAXIMIZEBOX кнопка максимизации окна

WS_MINIMIZEBOX кнопка минимизации окна

WS_THICKFRAME наличие рамки

WS_HSCROLL горизонтальная линейка прокрутки

WS_VSCROLL вертикальная линейка прокрутки

WS_DLGFRAME

WS_BORDER наличие границы

WS_CAPTION наличие заголовка окна

WS_MAXIMIZE

WS_CLIPCHILDREN

WS_CLIPSIBLINGS

WS_DISABLED активность окна

WS_VISIBLE видимость окна

WS_MINIMIZE

WS_OVERLAPPED перекрывающиеся окно

WS_CHILD дочернее окно

WS_POPUP вспомогательное окно

Рис.9. Идентификаторы стилей окон Windows.

Все основные типы окон могут оформляться основными стандартными элементами.

Комбинируя флаги, можно модифицировать внешний вид и некоторые свойства окон.

WS_MAXIMIZEBOX (WS_TABSTOP)

Создаваемое перекрывающееся окно имеет кнопку максимизации.

Если окно является дочерним органом управления (child window controls) внутри окна диалога, то этот флаг используется под другим именем - WS_TEBTOP; при работе с окном диалога по нажатию клавиши табуляции курсор перемещается к ближайшему окну (органу управления), у которого установлен флаг WS_TABSTOP.

WS_MINIMIZEBOX (WS_GROUP)

Создаваемое окно является дочерним органом управления (child window controls) внутри окна диалога, то этот флаг используется под другим именем- WS_GROUP. Орган управления, помеченный этим флагом, определяет начало группы органов управления, по которой можно перемещаться клавишами перемещения курсора. Группа оканчивается там, где начинается следующая группа.

WS_THICKFRAME

Создаваемое окно имеет рамку существенно заметной толщины; эта рамка является более чем украшением, потому что вы можете изменять размер только того окна , у которого этот флаг указан.

WS_SYSMENU

Окно имеет системное меню.

WS_HSCROLL

Окно имеет горизонтальную полосу просмотра.

WS_VSCROLL

Окно имеет вертикальную полосу просмотра.

WS_DLGFRAME

Окно имеет тонкую рамку без заголовка.

WS_BORDER

Окно имеет широкую рамку без заголовка. Этот флаг используют при создании диалоговых окон.

WS_CAPTION

Окно имеет рамку и заголовок. Так как окно будет иметь заголовок, то пользователь сможет перемещать его по экрану при помощи мыши. Флаг, как правило, используется для перекрывающихся окон.

WS_MAXIMIZE

Создаваемое окно будет отображено в максимально возможном для него размере.

WS_CLIPCHILDREN

Исключение областей, занимаемых дочерними окнами при изменении рабочей области родительского окна. Используется только для родительских окон.

WS_CLIPSIBLINGS

Исключение областей, занимаемых другими дочерними окнами из изменяемой области дочернего окна. Другими словами, если дочерние окна перекрываются, а флаг WS_CLIPSIBLINGS не указан, то при изменении рабочей области одного из окон могут быть испорчены рабочие области других дочерних окон. Этот флаг используется только с флагом WS_CHILD.

WS_DISABLED

Создается неактивное окно.

WS_VISIBLE

Окно становится видимым сразу после создания. Этот флаг используется для диалоговых окон.

WS_MINIMIZE

Создаваемое окно будет отображено в виде пиктограммы.

Наиболее часто используемые определения типов окон - WS_OVERLAPPEDWINDOW, WS_POPUPWINDOW и WS_CHILDWINDOW; эти стандартные комбинации флагов определены в файле windows.h:

# define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \

WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | \ WS_MAXIMIZEBOX)

# define WS_POPUPWINDOW (WS_POPUP | WS_ BORDER | WS_SYSMENU)

# define WS_CHILDWINDOW (WS_CHILD)

Вспомогательные окна

Вспомогательные (popup) окна обычно используются для отображения на короткий промежуток времени какой-либо информации. Диалоговые окна и окна сообщений тоже являются вспомогательными, но для работы с ними используются специальные функции .

Для каждого вспомогательного окна, как правило, организуется своя функция окна.

Вспомогательное окно можно создать, указав флаг WS_POPUP в третьем параметре вызова функции CreateWindow().

Приведем некоторые особенности вспомогательных окон.

  • Вспомогательные окна не имеют заголовка. Вы можете использовать флаг WS_BORDER или WS_DLGFRAME вместо WS_CAPTION для отображения рамки окна.

  • Вспомогательные окна часто должны иметь фиксированный размер (хотя это не является обязательным). Для этого надо исключить из определения типа окна флаги WS_THICKFRAME и WS_MAXINIZEBOX.

  • Вспомогательное окно может иметь, а может и не иметь окно-родителя. Если вспомогательное окно не имеет окна-родителя, то поле «индекс окна родителей» содержит NUUL, и вспомогательное окно совершенно независимо от создавшего его окна и по своим свойствам практически неотличимы от перекрывающихся окон. Поведение вспомогательного окна, имеющего родителя, зависит от того, что происходит с окном-родителем.

  • Когда главное окно минимизируется, вспомогательное окно без «родителя» скрывается, а вспомогательное окно с «родителем» остается на экране сверху (как поплавок всегда оказывается сверху). Это справедливо и в том случае, когда вспомогательное окно минимизировано (что производит довольно неприятное впечатление); по этой причине иногда рекомендуется защищать минимизацию окна, не указывая вспомогательному окну флаг WS_MINIMIZEBOX.

Дочерние окна

Дочерние окна могут иметь самые различные функции, принимать всевозможные формы и размеры. Текстовые поля, редакторы, кнопки, окна-списки - все они являются частными случаями класса дочерних окон.

Дочерние окна имеют следующие особенности.

  • Дочерние окна никогда не отображаются вне своего родительского окна ни в раскрытом виде, ни в виде пиктограммы: они как бы целиком принадлежат родителю.

  • Координаты дочерних окон отсчитываются не от верхнего левого угла экрана дисплея, а от верхнего левого угла рабочей области окна-родителя. При перемещении родительского окна по экрану дочерние окна перемещаются вместе с ним, так что их относительные координаты остаются неизменными.

  • Дочернее окно никогда не может стать активным окном.

Таким образом:

  • Перекрывающееся окна (overlapped window) окно никогда не имеет родителя.

  • Дочернее окно (child window) всегда имеет родителя.

  • Вспомогательное (popup window) окно может иметь, а может и не иметь родителя, то все равно это не дочернее, а вспомогательное окно.