Ich mache ein benutzerdefiniertes Steuerelement in Delphi (geerbt von TCustomControl
), die aus einer Anzahl von Polygonlistenelementen (unregelmäßige Formen) besteht. Ich muss Mausereignisse pro Element implementieren, aber zuerst muss ich erkennen können, ob die Mausposition innerhalb eines gegebenen Polygons liegt (array of TPoint
). Ich erhalte die Nachricht zum Treffer-Test (WM_NCHITTEST
) und hier muss ich diese Validierung durchführen. Ich habe eine Anzahl von Polygonen, ich mache eine Schleife durch jedes Polygon-Objekt und führe diese Prüfung durch, um zu sehen, ob sich die X/Y-Position der Maus innerhalb dieses Polygons befindet.Identifizieren, ob ein Punkt innerhalb eines Polygons liegt?
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;
Nur um darauf hinzuweisen, fehlt mir eine Zeile Code 'P: = ScreenToClient (P);' direkt nach dem Zuweisen von 'P.X' und' P.Y'. Dadurch werden diese Punkte relativ zum Bildschirm relativ zum Steuerelement konvertiert. –
Natürlich könnte es so einfach sein wie 'P: = ScreenToClient (Point (Message.XPos, Message.YPos));' (3 Zeilen Code in einen verwandeln) –