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

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(parameter!, parameter?, parameter3)

END_MESSAGE_MAP

Макрос BEGIN_MESSAGE_MAP открывает объявление карты сообщений,
макрос END_MESSAGE_MAP завершает это объявление, а один или несколько
макросов MESSAGE_HANDLER вводят в карту соответствующие сообщения. В
макросе MESSAGE_HANDLER первый параметр указывает имя сообщения, вто-
рой — тип структуры сообщения, а третий — имя функции-обработчика.

Имя сообщения пишется заглавными буквами и должно соответствовать пре-
допределенному в Windows сообщению. Например, WM_CLOSE. Имя типа струк-
туры сообщения может быть любым, но обычно принято делать его тождествен-
ным имени обрабатываемого сообщения с исключенным из него символом подчер-
кивания и добавленным префиксом Т. Например, T,WMClose. Передаваемый в об-
работчик параметр этого типа представляет собой структуру, через которую в обра-
ботчик передаются параметры сообщения, а из обработчика возвращается значе-
ние поля Result, фиксирующее результат обработки. Имя функции-обработчика
сообщения также может быть любым, но обычно оно образуется из имени сообще-
ния исключением первых символов WM_ и добавлением префикса On. Например,
OnClose.

Давайте введем в рассмотренное ранее наше приложение PMess2 и в форму
Form2 приложения PMessI обработку тех сообщений WM_CLOSE, которые мы
посылаем им из формы Forml. Для этого поместим на форму Formi приложения
PMess2 и на форму Form2 приложения PMessI метки Labell, чтобы отображать в
них текст, свидетельствующий о том, что обработка сообщения действительно про-
исходит. Введем в модулях этих форм следующие обработчики (текст приведен
для Form2; для Forml все то же самое с заменой идентификатора Form2 на
Forml):

// модуль U2Messl.h

class TForm2 : public TForm

<

published:     // IDE-managed Components
TLabel *Labell;

private:         // User declarations

void _fastcall OnClose(TWMCloses Messages-
public:           // User declarations
_fastcall TForm2(TComponent* Owner);

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(WM__CLOSE, TWMClose, OnClose)
END_MESSAGE_MAP(TComponent)
};

//—————————————————————————

// модуль U2Messl.cpp

void _fastcall TForm2::OnClose(TWMClose& a)
{
Label2->Caption = "Караул! Закрывают!";

if (MessageDlgPos("Меня хотят закрыть. Согласны?",
mtConf inflation, TMsgDIgButtons () « mbYes« mbNo « inbCancel,
0,BoundsRect.Left,BoundsRect.Bottom) == mrYes)
Closet) ;

else Label2->Caption = "He закроюсь!";

a.Result = 0;

}

В этом коде в файле U2Messl.h в разделе public объявлена карта сообщений, в
которую включено сообщение WM_CLOSE. Для этого сообщения объявлен обра-