Mapa komunikatów
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.
Mapę budujemy zazwyczaj w sekcji private formy, zaraz po zdeklarowaniu procedur(y) obsługujących(ej). Jej postać jest następująca:
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:
END_MESSAGE_MAP(Klasa_bazowa) - koniec mapy, w nawiasie musimy podać nazwę klasy głównej, do której będzie docierać komunikat. Zazwyczaj TForm.
Na formę wstawiamy 6 labeli wg schematu:
Deklaracja klasy powinna wyglądać następująco:
Teraz pozostaje tylko napisać definicję samej procedury obsługi:
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ż:
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ż: