
- •Лекция 1. Введение в программирование под Windows
- •Основные общие свойства Windows-платформ.
- •Приложения, потоки и окна
- •Классы окон
- •Типы сообщений
- •Приложения также могут определять собственные сообщения.
- •Вызов функций Windows
- •Оконная функция – функция обратного вызова
- •Синхронные и асинхронные сообщения
- •Разделение аппаратных ресурсов
Классы окон
Основное поведение окна определяется классом окон. Класс окна (не путать с понятием “класс” языка программирования C++) несет информацию о начальном внешнем виде окна, пиктограмме по умолчанию, курсоре и ресурсе меню, связанном с окном; и, что, возможно, более важно – об адресе функции, называемой оконной процедурой.
Когда приложение обрабатывает сообщения, оно обычно делает это посредством вызова функции DispatchMessage для каждого принятого сообщения - это происходит в так называемом цикле сообщений. В свою очередь, функция DispatchMessage вызывает соответствующую оконную процедуру, проверяя, для какого класса окна предназначено сообщение. Именно эта оконная процедура (функция окна) действительно обрабатывает сообщение, переданное окну.
Функция окна анализирует это сообщение и его параметры, а затем, при необходимости, выполняет некоторые действия.
Можно считать, что единственная для каждого окна функция окна реализует все методы окна как объекта. В языке C++, напротив, каждый метод объекта (класс) реализуется отдельной функцией, называемой обычно функцией-членом. Для реализации методов функция окна анализирует сообщение и однозначно определяет нужный метол.
Рассмотрим, какие типы классов окон существуют.
Существует множество стандартных классов окон, предусмотренных самой операционной системой Windows. Эти системные глобальные классы реализуют функциональные возможности общих элементов управления.
Любое приложение может использовать эти классы в своих окнах; например, реализовать элемент управления – поле ввода, используя класс окна Edit.
Приложение также может определять собственные классы окон с помощью функции RegisterClass. Эта функция позволяет программисту реализовать поведение окна, не являющегося частью ни одного из поддерживаемых системой глобальных классов.
Например, таким образом, типичное приложение реализует функциональные возможности своего главного окна, регистрирует пиктограмму главного окна и ресурса меню.
В Windows предусмотрен механизм наследования. Он реализуется с использованием так называемых классов окна. Перед созданием окна, необходима регистрация класса окна.
Для каждого класса окна определяется функция окна. При создании окна необходимо указать, к какому классу окна оно будет принадлежать и, соответственно, какую функцию окна будет использовать для обработки сообщений. Приложения могут создавать собственные оконные классы окна и свои функции окна (и следовательно свои методы), или использовать стандартные, определенные в Windows классы окна.
Например, можно создать окно изображающее кнопку и для него определить функцию окна, которая будет обрабатывать сообщения от мыши. Эта функция будет обрабатывать сообщения, и рисовать кнопку в нажатом и отжатом состоянии. Но в Windows уже определен класс окна, соответствующий кнопке.
Windows также позволяет разбивать существующие окна на подклассы (субклассы) и суперклассы.
Разбиение на подклассы замещает оконную процедуру для класса окна на другую процедуру. Это разбиение осуществляется путем изменения адреса процедуры через функцию SetWindowLong (в случае простого разбиения на подклассы) или SetClassLong (в случае глобального разбиения на подклассы). При этом в первом случае изменится только поведение определенного окна, а во втором – поведение всех окон указанного класса, создаваемых данным приложением.
Операция создания суперкласса создает новый класс на основе существующего, сохраняя его оконную процедуру. Чтобы создать суперкласс из класса окна, приложение извлекает информацию о классе с помощью функции GetClassInfo, изменяет полученную таким образом структуру WNDCLASS и использует измененную структуру при вызове RegisterClass.
Через функцию GetClassInfo приложение также получает адрес оригинальной оконной процедуры, который остается тот же; сообщения, которая не обработала новая оконная функция, должны быть переданы оригинальной процедуре.
Замечание. Несмотря на то, что используемая выше терминология напоминает терминологию объектно-ориентированного программирования, понятие класса окна не следует путать с понятиями C++. Понятие класса окна возникло на несколько лет раньше начала использования в Windows объектно-ориентированных языков.