Estoy haciendo un control personalizado en Delphi (heredado de TCustomControl
) que consiste en una serie de elementos de la lista de polígonos (formas irregulares). Necesito implementar eventos de mouse por artículo, pero primero debo ser capaz de detectar si la posición del mouse está dentro de un polígono determinado (array of TPoint
). Estoy capturando el mensaje Prueba de aciertos (WM_NCHITTEST
) y aquí es donde tendré que hacer esta validación. Tengo varios polígonos, haré un bucle en cada elemento del polígono y realizaré esta comprobación para ver si la posición X/Y del mouse está dentro de este polígono.¿Identifica si un punto está dentro de un polígono?
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;
Solo para señalar, me falta una línea de código 'P: = ScreenToClient (P);' justo después de asignar 'P.X' y' P.Y'. Esto convierte esos puntos de ser relativos a la pantalla a ser relativos al control. –
Por supuesto, podría ser tan fácil como 'P: = ScreenToClient (Point (Message.XPos, Message.YPos));' (convertir 3 líneas de código en uno) –