Mapa komunikatów
JaskMar
Aby w swoim programie pisanym w C++ Builder lub Turbo C++ "ustawić" procedurę, która będzie przechwytywać tylko jeden konkretny komunikat, musimy skorzystać z tzw. mapy komunikatów.
Budowa
Mapę budujemy zazwyczaj w sekcji Private formy, zaraz po zdeklarowaniu procedur(y) obsługujących(ej). Jej postać jest następująca:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(NAZWA_KOMUNIKATU_1, Typ_struktury_komunikatu, Nazwa_procedury_przechwytujacej_1)
MESSAGE_HANDLER(NAZWA_KOMUNIKATU_2, Typ_struktury_komunikatu, Nazwa_procedury_przechwytujacej_2)
//...
END_MESSAGE_MAP(Klasa_bazowa)
Mapę komunikatów zaczynamy poleceniem BEGIN_MESSAGE_MAP
. Jest to makro z modułu sysmac.h.
MESSAGE_HANDLER to równierz makro, przyjmujące parametry:
*NAZWA_KOMUNIKATU - tutaj wpisz, jaki komunikat chcesz przechwycić;
*Typ_struktury_komunikatu - komunikaty można przechwytywać za pomocą wielu struktur, np. TMsg, TMessage, i struktór specyficznych dla danego komunikatu, np. TWmLButtonDown, TWMRButtonDown itd. Podana struktura musi być również typem parametru procedury przechwytującej.
*Nazwa_procedury_przechwytujacej - jak sama nazwa wskazuje.
END_MESSAGE_MAP(Klasa_bazowa) - koniec mapy, w nawiasie musimy podać nazwę klasy głównej, do której będzie docierać komunikat. Zazwyczaj TForm
.
Przykład
Przedstawię teraz niewielki program, używający mapę komunikatów. Jego zadaniem będzie liczenie ile razy użytkownik kliknął na formę prawym przyciskiem myszy, oraz podawanie współrzędnych ostatniego kliknięcia.Na formę wstawiamy 6 labeli wg schematu:
Ilość kliknięć: Label3
Pozycja x: Label4
Pozycja y: Label5
Deklaracja klasy powinna wyglądać następująco:
class TForm1 : public TForm
{
__published: // IDE-managed Components
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TLabel *Label6;
private: // User declarations
unsigned ilosc; //licznik klikniec
void __fastcall WmRButtonDown(TWMRButtonDown &Msg); //procedura obsługująca komunikat WM_RBUTTONDOWN
BEGIN_MESSAGE_MAP //mapa komunikatow
MESSAGE_HANDLER(WM_RBUTTONDOWN, TWMRButtonDown, WmRButtonDown)
END_MESSAGE_MAP(TForm)
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
Teraz pozostaje tylko napisać definicję samej procedury obsługi:
void __fastcall TForm1::WmRButtonDown(TWMRButtonDown &Msg)
{
ilosc++;
Label4->Caption=IntToStr(ilosc);
Label5->Caption=IntToStr(Msg.XPos);
Label6->Caption=IntToStr(Msg.YPos);
}
Od tej pory, po przyciśnięciu prawym przyciskiem myszy w obszarze formy, program poda współrzędne myszy (na formie) i ilość pojedynczych kliknięć.
Zobacz też: