Ich mache ein benutzerdefiniertes Steuerelement in Delphi (geerbt von TCustomControl
), das aus einer Anzahl von Polygonlistenelementen (unregelmäßigen 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 Überprüfung durch, um zu sehen, ob die X / Y-Position der Maus innerhalb dieses Polygons liegt.
Überprüfen, ob der Punkt innerhalb eines Polygons liegt, können Sie sich vorstellen, indem Sie eine horizontale Linie durch diesen Punkt ziehen und dann von links nach rechts zählen, wie oft diese vorgestellte Linie ein Polygon kreuzt. Wenn die Anzahl der Polygonkreuze vor dem Auftreffen auf einen Punkt ungerade ist, dann ist der Punkt innerhalb, wenn der Punkt auch außerhalb eines Polygons liegt.
Es gibt eine andere Technik, die wir ausgiebig verwenden, die überhaupt keine Mathematik beinhaltet und extrem komplexe eingebettete Steuerelemente jeder Form handhaben kann. Stellen Sie einfach ein Off-Screen-Bild des Steuerelements bereit, in dem alle Teile farbcodiert sind (wie in der Abbildung unten gezeigt), auf die der Benutzer klicken könnte.
Wenn Sie ihre Maus bewegen, sehen Sie sich einfach die Farbe des Pixels unter der Maus in unserem Off-Screen-Bild an und das sagt uns genau, welche Schaltfläche / Kontrolle sie über-weiß für nicht darüber und jede Folge von Farben für die verschiedenen Teile.
// Pseudocode
%Vor%HINWEIS: Das beigefügte Farbmaskenbild stellt fünf identische kreisförmige Steuerelemente dar, die in Quadranten mit einer mittleren Schaltfläche aufgeteilt sind (und da alle die gleichen Farben verwenden, haben wir Konstanten für jede Farbe und bestimmen, welcher der fünf die Maus ist durch eine einfache XPosition) zusammen mit einer zusätzlichen irregulären Kontrolle zu ihrer Rechten und einem Satz oder rechteckigen Knöpfen darunter.
Tags und Links delphi delphi-xe2 custom-controls polygon