Knüpfen Sie keine all zu hohen Erwartungen an dieses Projekt, denn die Klasse Paint ist mehr auf die Verwendung in Paint-Scripten ausgelegt als auf das freie Zeichnen auf einer geeigneten Zeichenfläche wie einer DrawingArea.
Die Grundidee für eine hinreichend kontinuierliche Freihandlinie stammt von Tobias Boege. Sie besteht darin, sich den Punkt vom letzten MouseMove-Event zu merken und statt einzelne Punkte zu setzen, den letzten Punkt mit dem Punkt des aktuellen Events durch einen Geradenabschnitt (Strecke) mit LineTo() zu verbinden.
Das sind die Ergebnisse, deren Dynamik Sie erst dann erleben, wenn Sie das Programm selbst starten:
Abbildung 23.3.4.2.1: Startbildschirm …
Abbildung 23.3.4.2.2: Frühling mit Tulpe von H.L. aus O. 2015
Mit diesem Quelltext können auch Sie zum Kurz- und Kleinkunst-Maler werden:
' Gambas class file Private bStart As Boolean Private i As Integer Private pLast As PointF Public Sub Form_Open() FMain.Center FMain.Resizable = False txtMouseX.Mouse = Mouse.Blank ' TextBox ohne Mauszeiger txtMouseY.Mouse = Mouse.Blank btnClose.Mouse = Mouse.Pointing ' Mouse-Konstante (Hand) btnClear.Mouse = Mouse.Custom btnClear.Cursor = New Cursor(Picture["Mauszeiger/erase.png"]) ' Benutzerdefiniertes Mausbild ' Standard-Mausspitze ist die linke obere Ecke des Mausbildes ' Mit x=0 und y=15 liegt die Mausspitze auf der Bleistiftmine DrawingArea1.Mouse = Mouse.Custom DrawingArea1.Cursor = New Cursor(Picture["icon:/16/pen"], 0, 15) Paint.Begin(DrawingArea1) Paint.Brush = Paint.Color(Color.Red) Paint.Font = Font["Monospace, 38, bold"] ' Text zentriert auf dem Zeichenblatt im angegebenen Rechteck Paint.DrawText(("Angst vor Mäusen?"), 0, 35, DrawingArea1.W, DrawingArea1.H, Align.Top) Paint.End Timer1.Start End ' Form_Open() Public Sub DrawingArea1_MouseMove() If bStart = True Then bStart = False DrawingArea1.Clear Endif ' bStart = True Timer2.Start txtMouseX.Text = Mouse.X txtMouseY.Text = Mouse.Y If Mouse.Left = True Then Paint.Begin(DrawingArea1) If Mouse.X>5 And Mouse.X<DrawingArea1.Width - 5 And Mouse.Y>5 And Mouse.Y<DrawingArea1.Height - 5 Then SetPoint(Mouse.X, Mouse.Y, Color.Blue) Else pLast = Null Endif Paint.End Endif ' Mouse.Left = True? End ' DrawingArea1_MouseMove() Public Sub DrawingArea1_MouseDown() DrawingArea1_MouseMove() End ' DrawingArea1_MouseDown() Public Sub DrawingArea1_MouseUp() Timer2.Stop pLast = Null End ' DrawingArea1_MouseUp() Public Sub SetPoint(X As Integer, Y As Integer, cColor As Integer) If Not pLast Then Paint.FillRect(X, Y, 2, 2, cColor) Else Paint.MoveTo(pLast.X, pLast.Y) Paint.LineTo(X, Y) Paint.LineWidth = 2 Paint.Background = cColor Paint.Stroke() Endif pLast = New PointF(X, Y) End ' SetPoint(..) Public Sub btnClear_Click() DrawingArea1.Clear txtMouseX.Text = "0" txtMouseY.Text = "0" End ' btnClear_Click() Public Sub Timer1_Timer() ' Die schnellste Maus im Gambas-Land... Speedy Gamzales Paint.Begin(DrawingArea1) Paint.Translate(10, 155) Paint.Scale(1, -1) Paint.AntiAlias = False Paint.Brush = Paint.Color(Color.DarkGray) Paint.Arc(10 + i, 30, 4) Paint.Fill Paint.Brush = Paint.Color(&HFFFFDF) Paint.Arc(10 + (i - 8), 30, 4) Paint.Fill i = i + 8 DrawingArea1.Refresh Paint.AntiAlias = True Paint.End If i > DrawingArea1.Width Then bStart = True Timer1.Stop Endif End ' Timer1_Timer() Public Sub btnClose_Click() FMain.Close End ' btnClose_Click()