Лекция 3. Иерархия окон Windows. Типы окон 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лекция 3. Иерархия окон Windows. Типы окон



Для пользователя окно в Windows выглядит как прямоугольная экранная область. С системной точки зрения окно – это абстрактное понятие, обозначающее простейший элемент, с помощью которого взаимодействуют пользователь и приложение. Окна Windows разнообразны: есть и "очевидные" окна приложений и диалоговые окна, и "менее очевидные", такие, как рабочий стол, пиктограммы и кнопки.

Окно – это не только область, в которую приложение выводит свои данные, но и получатель сообщений, несущих информацию о произошедших в среде Windows событиях. Хотя понятие окна в Windows было введено за несколько лет до широкого распространения на ПК объектно-ориентированных языков программирования, для описания окон очень удобно применять ОО-терминологию: свойства окна определяют его внешний вид, а методы ответственны за реакцию на команды пользователя.

У каждого окна в Windows есть уникальный дескриптор окна (это число, которое можно рассматривать как имя окна, доступное и приложению, и самой Windows). Переменные для хранения оконных дескрипторов обычно имеют тип HWND.

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

 

Иерархия окон

Для управления окнами Windows хранит информацию о них в иерархической структуре, упорядоченной по отношению принадлежности. Принадлежность бывает двух типов: родительское/дочернее окно и владелец/собственное окно.

У каждого окна есть родительское окно и могут быть окна того же уровня (сиблинги). В корне иерархии находится окно рабочего стола, которое Windows создает в процессе загрузки. Рабочий стол является родительским окном для окон верхнего уровня. У дочерних окон родительским окном может быть окно верхнего уровня или другое дочернее окно, расположенное выше по иерархии. На рис. 3.1 показана иерархия окон для типичного сеанса работы Windows.

 

Рис. 3.1. Иерархическое упорядочение окон в типичном сеансе работы Windows.

 

Окна одного уровня на экране могут перекрывать друг друга. Т.о., пользователь видит окна упорядоченными "по дальности". Обычно видимая иерархия окон соответствует их логической иерархии. Для окон-сиблингов порядок отображения называется Z-порядком. Для окон верхнего уровня этот порядок может быть изменен (например, пользователь может извлечь окно одного из приложений на передний план). Если назначить окну верхнего уровня оконный стиль WM_EX_TOPMOST, то оно всегда будет располагаться поверх своих сиблингов, не имеющих этого стиля.

Отношения родительское окно/дочернее и владелец/собственное окно отличаются тем, что дочернее окно ограничено областью своего родительского окна. Отношение владелец/собственное окно существует между окнами верхнего уровня для реализации Z-порядка. Собственное окно выводится на экран поверх окна-владельца и исчезает, когда окно-владелец сворачивается. Типичный пример отношения владелец/собственное окно наблюдается при отображении диалогового окна. Диалоговое окно не является дочерним окном (т.е. оно не ограничено клиентской областью главного окна приложения), но принадлежит главному окну приложения.

В Win32 API есть специальный набор функций для перебора окон в соответствии с их иерархией. Некоторые из этих функций перечислены ниже.

Функция GetDesktopWindow возвращает дескриптор окна рабочего стола.

Функция EnumWindows перебирает все окна верхнего уровня. При вызове приложение должно передать ей адрес функции обратного вызова. Эта функция будет вызываться изнутри EnumWindows для каждого окна верхнего уровня.

Функция EnumChildWindows перебирает все дочерние окна у заданного родительского окна. В процессе перебора вызывается пользовательская функция обратного вызова. EnumChildWindows при переборе учитывает порожденные дочерние окна, т.е. дочерние окна, которые сами принадлежат дочерним окнам заданного окна.

Функция EnumThreadWindows перебирает все окна, принадлежащие заданному потоку. При этом для каждого такого окна вызывается функция обратного вызова. В качестве параметров функции передаются адрес этой функции, а также дескриптор потока. При переборе учитываются окна верхнего уровня, дочерние окна и порожденные дочерние окна.

Функцию FindWindow можно применять для поиска окна верхнего уровня по заданному оконному классу или заголовку окна.

Функция GetParent возвращает дескриптор родительского окна для заданного дочернего окна.

Функция GetWindow предоставляет наиболее гибкий способ доступа к иерархии окон. В зависимости от второго параметра, uCmd, она может возвратить для заданного окна дескриптор родительского окна, окна-владельца, сиблинга, или дочернего окна.

 

Диалоговые окна

В большинстве приложений, кроме главного окна приложения со строкой меню и специфическим для приложения содержимым, применяются диалоговые окна. Они служат для обмена данными между пользователем и приложением. Обычно главное окно присутствует на экране в течение всего сеанса работы приложения, а диалоговые окна появляются на небольшое время после выбора какой-либо команды приложения. Однако длительность пребывания на экране не является отличительной особенностью главного и диалогового окна. Бывают приложения, использующие диалоговое окно в качестве своего главного окна. В других приложениях диалоговое окно может присутствовать на экране большую часть сеанса работы.

Диалоговое окно содержит набор элементов управления, которые сами являются дочерними окнами. С их помощью пользователь и приложение обмениваются данными. В Win32 API есть набор функций для создания, отображения и управления содержимым диалогового окна. Программисту обычно не приходится заботиться о перерисовке элементов управления в соответствии с сообщениями от пользователя. Программист может сосредоточиться именно на вопросах обмена данными между элементами управления диалогового окна и приложением, а не на реализации видимой части интерфейса.

Диалоговые окна Windows делятся на два типа: модальные и немодальные.

 

Модальные диалоговые окна

При отображении модального диалогового окна его окно-владелец запрещается, что, по сути дела, означает приостановку приложения. Пользователь сможет продолжить работу с приложением только после завершения работы с модальным окном.

Для создания и активизации модального окна предназначена функция DialogBox. Эта функция создает диалоговое окно по данным из ресурсного файла (используется ресурс специального типа – шаблон диалогового окна) и выводит это окно на экран в модальном режиме. Приложение при обращении к DialogBox передает ей адрес функции обратного вызова. Эта функция (процедура диалогового окна) является оконной процедурой. DialogBox возвратит управление только после завершения окна из этой процедуры (обычно это делается с помощью функции EndDialog при обработке какого-то сообщения от пользователя, например, по нажатию кнопки OK).

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

 

Немодальные диалоговые окна

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

Немодальное окно создается функцией CreateDialog. В Win32 API нет аналога функции DialogBox для немодальных окон, поэтому приложения должны самостоятельно выполнять получение и диспетчеризацию сообщений для немодальных окон. Большинство приложений делают это в своем главном цикле обработки сообщений с помощью функции IsDialogMessage. Эта функция проверяет, предназначено ли сообщение заданному диалоговому окну, и при необходимости передает его в процедуру диалогового окна.

Немодальное окно не возвращает никакого значения своему владельцу. Но при необходимости немодальное окно и его владелец могут взаимодействовать с помощью функции SendMessage.

В процедуре немодального диалогового окна не надо вызывать функцию EndDialog. Такие окна уничтожаются вызовом функции DestroyWindow, например, при обработке пользовательского сообщения в процедуре диалогового окна.

Приложения обязаны следить за тем, чтобы перед завершением приложения были уничтожены все немодальные окна.

 



Поделиться:


Последнее изменение этой страницы: 2016-08-01; просмотров: 810; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.50.83 (0.012 с.)