Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / System / Multimedia / Paint

Polygone füllen und Flächen einfärben

Einführung

Das gute alte QuickBasic (bekannt aus DOS-Zeiten) kennt den Paint-Befehl, um ein Polygon mit einer bestimmten Farbe auszufüllen. VB kennt eine solche Möglichkeit leider nicht.

Abhilfe schafft mal wieder ein tiefer Griff in die API-Trickkiste: Mit der unten gezeigten Routine können Flächen schnell in der eingestellten Farbe (via FillColor) und mit dem definierten Füllmuster (via FillStyle) gefüllt werden.

Beispiel

Das folgende "Programm" erzeugt bei jeder Größenänderung des Formulars ein blau-schwarzes Linienmuster. Mit der linken Maustaste können vorhandene Flächen Rot umgefärbt werden. Dagegen werden mit der rechten Maustaste schwarz umrandete Polygone Grün eingefärbt. Man achte auf die unterschiedlichen Auswirkungen der blauen Linien:

Private Sub Form_Resize()
  Dim i As Long
  AutoRedraw = True
  Cls
  For i = 1 To 100
    ForeColor = IIf(Rnd > 0.2, vbBlack, vbBlue)
    Line (Rnd * ScaleWidth, Rnd * ScaleHeight) _
        -(Rnd * ScaleWidth, Rnd * ScaleHeight)
  Next i
End Sub

Private Sub Form_MouseUp(Button As Integer, _
    Shift As Integer, x As Single, y As Single)
  FillStyle = vbFSSolid
  If Button = vbLeftButton Then
    'vorhandene Fläche Rot einfärben:
    FillColor = vbRed
    Paint Me, x, y
  Else
    'schwarzes Polygon Grün füllen:
    FillColor = vbGreen
    Paint Me, x, y, vbBlack
  End If
End Sub

Code / Quelltext

Die folgende API-Funktion muss im Deklarationsteil eines Moduls zur Verfügung gestellt werden:

Private Declare Function ExtFloodFill Lib "gdi32" ( _
    ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _
    ByVal crColor As Long, ByVal wFillType As Long _
  ) As Long

Die eigentliche Routine erwartet das Grafikobjekt und die Koordinaten als Parameter. Da die API-Funktion alle Angaben in Pixel erwartet, müssen die Werte entsprechend umgerechnet werden. Wurde eine BorderColor angegeben, so wird gerade das Polygon ausgefüllt, welches durch die angegebene Farbe begrenzt wird; Andernfalls wird die vorhandene Fläche (definiert durch die vorgefundene Farbe) umgefärbt:

Public Sub Paint( _
    ByRef obj As Object, _
    ByVal x As Single, y As Single, _
    Optional ByVal BorderColor As Long = -1)
  'FillType-Konstanten:
  Const FLOODFILLBORDER = 0
  Const FLOODFILLSURFACE = 1
  
  'Koordinaten in Pixel:
  Dim PixX As Long
  Dim PixY As Long
  
  With Form1
    'Umrechnung in Pixel:
    PixX = CLng(.ScaleX(x, .ScaleMode, vbPixels))
    PixY = CLng(.ScaleY(y, .ScaleMode, vbPixels))
    
    If BorderColor = -1 Then
      'vorhandene Fläche umfärben:
      ExtFloodFill .hdc, PixX, PixY, _
                   .Point(x, y), FLOODFILLSURFACE
    Else
      'Polygon füllen:
      ExtFloodFill .hdc, PixX, PixY, _
                   BorderColor, FLOODFILLBORDER
    End If
  End With
End Sub

© Jost Schwider, 11.08.2001-11.08.2001 - http://vb-tec.de/paint.htm