Zastanawiałem się dzisiaj w jaki sposób przechwycić zdarzenie kliknięcia myszą na formularzu. Zbudowałem sobie formularz, na którym położyłem kilka paneli. Mają one przedstawiać pewne urządzenia. Pomyślałem sobie, że fajnie byłoby aby można było wybierać te panele klikając na nich. Taki panel wtedy zmieniałby kolor aby użytkownik wiedział, że panel ten jest aktywny. Wszystko czego potrzeba to obsłużyć kliknięcie myszy. No tak ale na każdym panelu znajduje się kilka kontrolek i klikając na kontrokę znajdującą sie w panelu trzaba byłoby sprawdzić do jakiefgo panelu należy. Możnaby posłużyc się właściwościa Owner (właściciel) kontrolki. a jeśli kontrolka umiesczona jest w innej kontrolce i dopiero potem na panelu? Cóż wtedy trzeba byłoby sprawdzić czy właściciel ma właściciela, który jest panelem… Hm… Może jednak lepiej przechwycić komunikat kliknięcia myszą zanim zostanie ono przekazane do kontrolek niżej… W Delphi 4 w klasie Tapplication jest zdarzenie messageEvent(var Msg: TMsg;
var Handled: Boolean); wszelkie komunikaty kierowane do aplikacji mozna tutaj obsłużyć. Napisałem więc:
procedure TMainForm.FmessageEvent(var Msg: TMsg; var Handled: Boolean);
var
pt: Tpoint;
begin
case msg.message of
// obsługa komunikatu klikniecia lewym przyciskiem myszy
WM_LBUTTONDOWN: begin
if oknoPaneli then
begin
// pobierz pozycję kursora myszy (jest równiez w strukturze TMsg)
pt := mouse.cursorPos;
// sprawdź czy kliknieto w jakims panelu i wykonaj akcję
paneleForm.mouseClickWithinPanel(pt);
end;
end;
end;
handled := false;
end;
A oto wynik zaznaczony panel objęto pomarańczową ramka:
