Sto creando un controllo personalizzato in Delphi (ereditato da TCustomControl
) che consiste in un numero di voci di un elenco di poligoni (forme irregolari). Devo implementare eventi del mouse per elemento, ma prima devo essere in grado di rilevare se la posizione del mouse si trova all'interno di un dato poligono (array of TPoint
). Sto recuperando il messaggio Hit Test (WM_NCHITTEST
) ed è qui che dovrò fare questa convalida. Ho un numero di poligoni, eseguirò un ciclo attraverso ogni oggetto poligonale ed eseguirò questo controllo per vedere se la posizione X/Y del mouse si trova all'interno di questo poligono.Identificare se un punto si trova all'interno di un poligono?
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;
Giusto per precisare, mi manca una riga di codice 'P: = ScreenToClient (P);' subito dopo l'assegnazione di 'P.X' e' P.Y'. Ciò converte quei punti dall'essere relativi allo schermo rispetto al controllo. –
Ovviamente potrebbe essere facile come 'P: = ScreenToClient (Point (Message.XPos, Message.YPos));' (trasforma 3 righe di codice in una sola) –