Programowanie w języku C/C++ » Artykuły

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.

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ż: