Tworzę niestandardowe sterowanie w Delphi (odziedziczonym po TCustomControl
), które składa się z wielu elementów listy wielokątów (nieregularne kształty). Muszę zaimplementować zdarzenia myszy na element, ale najpierw muszę być w stanie wykryć, czy pozycja myszy znajduje się w danym wielokącie (array of TPoint
). Dostaję wiadomość Hit Test (WM_NCHITTEST
) i to jest miejsce, gdzie będę musiał wykonać tę walidację. Mam wiele wielokątów, zrobię pętlę przez każdy element wielokąta i wykonam tę kontrolę, aby zobaczyć, czy pozycja X/Y myszy znajduje się w tym wielokącie.Określ, czy punkt znajduje się wewnątrz wielokąta?
procedure TMyControl.WMNCHitTest(var Message: TWMNCHitTest);
var
P: TPoint; //X/Y of Mouse
Poly: TPoints; //array of TPoint
X: Integer; //iterator
I: TMyListItem; //my custom list item
begin
P.X:= Message.XPos;
P.Y:= Message.YPos;
for X := 0 to Items.Count - 1 do begin
I:= Items[X]; //acquire my custom list item by index
Poly:= I.Points; //acquire polygon points
//Check if Point (P) is within Polygon (Poly)...?
end;
end;
Dla podkreślenia brakuje jednego wiersza kodu 'P: = ScreenToClient (P);' zaraz po przypisaniu 'P.X' i' P.Y'. To konwertuje te punkty z relatywnego względem ekranu na względne względem kontroli. –
Oczywiście może to być tak proste jak 'P: = ScreenToClient (Point (Message.XPos, Message.YPos));' (zamień 3 linie kodu w jeden) –