vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Grafik und Font · Sonstiges   |   VB-Versionen: VB4, VB5, VB631.08.04
Kreisregion erstellen

Dieses Beispiel zeigt, wie man mittels der API-Funktion CreateEllipticRgn Kreisregionen erstellt.

Autor:   DonBewertung:  Views:  10.667 
ohne HomepageSystem:  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



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.