Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВВЕДЕНИЕ В ОБЪЕКТНО Ориентированное программиро...docx
Скачиваний:
19
Добавлен:
29.08.2019
Размер:
1.01 Mб
Скачать

Обработка сообщений Windows

Во многих операционных системах взаимодействие приложения с системой инициирует приложение. Например в МS DOS приложение выполняет запросы к системе при необходимости осуществить ввод/вывод данных. Таким образом, программы, написанные в традиционном стиле сами обращаются к операционной системе. Однако программы под Windows работают не так. Именно Windows обращается к программе. Этот процесс выглядит следующим образом:

1. При создании окна, в том числе оконного элемента управления, приложение регистрирует его оконную процедуру MainWNDProc в ядре Windows.

2. Сообщение Windows поступает в метод MainWndProc;

3. Метод MainWndProc вызывает метод, адрес которого содержится в свойстве WindowsProc. По умолчанию здесь содержится адрес виртуального метода WndProc. Метод MainWndProc называют оконной процедурой;

4. Для разных компонентов внутри WndProc может быть предусмотрена обработка тех или иных сообщений. В противном случае вызывается виртуальный метод TObject.Dispatch, который реализует поиск необходимого динамического метода-обработчика по индексу сообщения;

5. Если метод Dispatch не нашел обработчика для данного индекса сообщения, вызывается виртуальный метод DefaultHandler. Если и он не может обработать данное сообщение, то вызывается стандартный обработчик Windows.

Сообщения Windows

Сообщение Windows представляет собой запись, состоящую из нескольких полей. Наиболее важным из них является 4-х байтовое поле, содержащее идентификатор сообщения. Идентификаторы сообщений содержатся в модуле Messages. Другая полезная информация сообщения содержится в двух полях параметров и поле результата. Параметры и поле результата представляют собой 32 битовые величины. Часто каждый из них будет содержать более чем один блок информации, тогда могут использоваться имена типа IParamHi -верхнее по порядку слово в двойном слове.

Для каждого типа сообщений в Delphi определен тип запись, который дает осмысленные названия каждому параметру. Пример - сообщение без параметров:

Обработчики сообщений Windows

Методы, предназначенные специально для обработки сообщений Windows, составляют подмножество динамических методов и объявляются директивой message, за которой следует индекс - идентификатор сообщения. Метод имеет единственный параметр, передаваемый по имени. Параметр метода в Delphi представляет собой запись типа, определенного для соответствующего типа сообщения. Директива override не используется. Область видимости - protected. Например:

То что этот метод будет вызываться для обработки именно этого сообщения определяется не по его имени или типу параметров, а исключительно по идентификатору сообщения. Хотя имена обычно даются осмысленные, начинающиеся с WM (WindowsMessage), например WMPaint

Реализация обработчика сообщения может включать вызов перекрытого обработчика и дополнительные действия, например:

Оператор inherited вызовет поиск перекрытого метода по иерархии наследования до первого обработчика сообщения с тем же идентификатором и автоматическую передачу сообщения ему. Если такого обработчика найдено не будет, то inherited вызовет метод DefaultHandler, изначально определенный в TObject. Реализация DefaultHandler в TObject не выполняет никаких действий, а просто возвращает управление. Перекрывая DefaultHandler, класс может определить свою собственную обработку сообщений по-умолчанию,