Rubrik: Grafik und Font · Sonstiges | VB-Versionen: VB4, VB5, VB6 | 31.08.04 |
Kreisregion erstellen Dieses Beispiel zeigt, wie man mittels der API-Funktion CreateEllipticRgn Kreisregionen erstellt. | ||
Autor: Don | Bewertung: | Views: 10.667 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Dieses Beispiel zeigt, wie man mittels der CreateEllipticRgn Kreisregionen erstellt. Zudem lassen sich die Regionen mit der aktuellen FillColor-Farbe füllen und es läßt sich überprüfen, ob die Maus innerhalb oder außerhalb der Region ist. Die erstellte Region ist zunächst unsichtbar, sofern sie nicht mit einer gewählten FillColor-Farbe gefüllt wird. Um das zu tun, benötigen wir die PaintRgn API-Funktion, die die Region mit der aktuellen Fillcolor-Farbe füllt.
Damit wir auch wissen, wo sich die Maus befindet, also innerhalb oder außerhalb der Region, benötigen wir noch eine weitere API-Funktion: PtInRegion. Der Funktion gibt einen Wert <> 1 zurück, wenn sich der angegebene Punkt innerhalb der Region befindet bzw. 0, wenn der Punkt außerhalb der Region liegt.
Um das Ganze etwas spannender zu machen, habe ich ein Feld erstellt, das 1000 gleiche Regionen erzeugt. Fährt man nun mit der Maus über die Region wechselt der Mauskursor zu einem Kreuz. Zudem wird der Index der jeweiligen Region in einem Label-Control ausgegeben.
Alles was benötigt wird ist eine Form und ein Label-Control, sowie nachfolgender Code:
Option Explicit ' Benötigte API-Deklarationen Private Declare Function CreateEllipticRgn Lib "gdi32" ( _ ByVal X1 As Long, _ ByVal Y1 As Long, _ ByVal X2 As Long, _ ByVal Y2 As Long) As Long Private Declare Function PtInRegion Lib "gdi32" ( _ ByVal hRgn As Long, _ ByVal x As Long, _ ByVal y As Long) As Long Private Declare Function PaintRgn Lib "gdi32" ( _ ByVal hdc As Long, _ ByVal hRgn As Long) As Long Private Declare Function DeleteObject Lib "gdi32" ( _ ByVal hObject As Long) As Long ' Regionen indexsieren! Dim Region(1000) As Long ' Variable zum Überprüfen der Region Dim Innen As Long
Private Sub Form_Load() Dim i As Long Dim x As Long Dim y As Long With Me .AutoRedraw = True .ScaleMode = vbPixels .FillStyle = vbFSSolid Randomize -Timer For i = 0 To 1000 x = Int(Rnd * 700) y = Int(Rnd * 700) ' Denkbar ist natürlich auch eine elliptische Form. ' Hierzu braucht man nur einen der hinter x,y ' angegebenen Werte zu ändern. Region(i) = CreateEllipticRgn(x, y, x + 20, y + 20) ' Leere Kreisregion mit Fillcolor füllen Innen = PaintRgn(.hdc, Region(i)) Next i End With End Sub
' Mausposition prüfen Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _ x As Single, y As Single) Dim i As Long ' Alle Rgionen(0-1000) druchgehen For i = 0 To 1000 ' Wenn Maus innerhalb von Kreisregion ist: Innen = PtInRegion(Region(i), x, y) ' Verlassen der Schleif If Innen <> 0 Then Exit For Next i If Innen <> 0 Then Form1.MousePointer = vbCrosshair ' Den Index der Region in Label ausgeben Label1.Caption = i Else Form1.MousePointer = vbDefault End If End Sub
' Speicher wieder freigeben Private Sub Form_Unload(Cancel As Integer) Dim i% For i = 0 To UBound(Region) Call DeleteObject(Region(i)) Next i End Sub