Kontakt
DSVGO
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.
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
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