Взаимодействие приложения с внешними программами______________387

ющиеся информацией с вашим приложением и, наконец, ваше приложение, посы-
лающее сообщения компонентам.

Большинство сообщений, которые вам могут потребоваться, C++Builder обра-
батывает сам, так что вам достаточно использовать обработчики стандартных со-
бытий компонентов. Но иногда вам может потребоваться самому обрабатывать со-
общения Windows. Такая необходимость возникает, если нужное вам сообщение
пока еще компонентами C++Builder не обрабатывается, или если вы определили
свое собственное сообщение.

Сообщение Windows представляет собой структуру, содержащую поля. Наибо-
лее важное из них содержит целое значение, идентифицирующее данное сообще-
ние. В C++Builder содержатся объявления множества идентификаторов, позволя-
ющие оперировать с мнемоническими именами сообщений, а не с какими-то целы-
ми значениями. Важная информация о сообщении содержится также в двух полях
параметров и в поле результата. Раньше ссылки на параметры осуществлялись
как на wParam (word parameter — параметр типа word) и IParam (long parame-
ter — параметр типа long). В ряде случаев каждый параметр содержал несколько
данных, на которые надо было ссылаться, например, как на IParamHi — старший
разряд параметра IParam.

Сейчас Microsoft ввел для параметров имена, что существенно упрощает рабо-
ту с ними. В C++Builder также введены мнемонические имена параметров. Так что
теперь, например, при обработке сообщения от мыши можно ссылаться на понят-
ные параметры XPos и YPos, а не на стаг '.артные и ни о чем не говорящие имена
IParamLo и IParamHi.

Последовательность обработки сообщений Windows следующая. При создании
объекта оконного компонента — потомка TWinControl, он регистрируется в Win-
dows и получает уникальный идентификатор — дескриптор (handle). Вы можете
получить к нему доступ через свойство Handle (только для чтения). При регистра-
ции окно передает Windows указатель на процедуру, которая будет вызываться
при получении им сообщений от Windows. Это метод MainWndProc. Его назначе-
ние — вызов метода обработки сообщений через свойство WindowProc. По умолча-
нию в этом свойстве хранится процедура WndProc, но пользователь может изме-
нить ее на свою во время выполнения приложения. Метод WndProc представляет
собой оператор switch, анализирующий идентификатор сообщения и производя-
щий соответствующие действия. В итоге все сообщения передаются методу Dis-
patch, который просматривает таблицу методов класса объекта и извлекает из нее
тот, который имеет требуемый идентификатор сообщения. Если требуемый метод
не найден — вызывается обработка сообщения по умолчанию.

Таким образом, обработка сообщения Windows происходит по цепочке:

событие => MainWndProc => WndProc => Dispatch => обработчик события

Для сообщений, обрабатываемых компонентами C++Builder, вам достаточно
написать свой обработчик события. Для сообщений, не предусмотренных в C++Bu-
ilder, вам надо вмешаться в эту цепочку раньше, перегрузив метод WndProc.

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

В Windows предусмотрено множество сообщений. Описание некоторых из них
приводится в главе 14, раздел 14.15.2. Для дальнейших экспериментов нам потре-
буется только два сообщения. Первое из них — WM_CLOSE, сигнализирующее,
что окно или приложение закрывается. Это сообщение не имеет параметров. По
умолчанию оно уничтожает окно, которому послано. Если приложение обрабаты-
вает это сообщение, то оно должно возвращать нуль.

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

13*