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

5.2.3. Окна и сообщения

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

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

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

5.2.4. Приложения, потоки и окна

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

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

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

5.2.5. Классы окон

Основное поведение окна определяется классом окон. Класс окна (не путать с понятием “класс” языка программирования C++) несет информацию о начальном внешнем виде окна, пиктограмме по умолчанию, курсоре и ресурсе меню, связанном с окном; и, что более важно – об адресе функции, называемой оконной функцией. Когда приложение обрабатывает сообщения, оно обычно делает это посредством вызова специальной Win32 API функции для каждого принятого сообщения. Эта функция, в свою очередь, вызывает соответствующую оконную функцию, проверяя, для какого класса окна предназначено сообщение.

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

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

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

Windows также позволяет разбивать существующие окна на субклассы и суперклассы. Разбиение на субклассы замещает оконную процедуру для класса окна на другую процедуру. Это разбиение осуществляется путем изменения адреса процедуры через функцию API SetWindowLong(), в случае простого разбиения на подклассы или SetClassLong(), в случае глобального разбиения на подклассы. При этом в первом случае изменится только поведение определенного окна, а во втором – поведение всех окон указанного класса, создаваемых данным приложением.

Операция создания суперкласса создает новый класс на основе существующего, сохраняя его оконную процедуру. Чтобы создать суперкласс из класса окна, приложение извлекает информацию о классе с помощью функции GetClassInfo(), изменяет полученную таким образом структуру WNDCLASS и использует измененную структуру при вызове RegisterClass(). Через функцию GetClassInfo() приложение также получает адрес оригинальной оконной процедуры, который остается тот же. А это значит, что сообщения, которые не обработала новая оконная функция, должны быть переданы оригинальной процедуре.

Несмотря на то, что используемая выше терминология напоминает терминологию объектно-ориентированного программирования, понятие класса окна не следует путать с понятиями C++. Понятие класса окна возникло на несколько лет раньше начала использования в Windows объектно-ориентированных языков.