23.3.4.2 Freihand-Zeichnen mit Paint

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:

B1

Abbildung 23.3.4.2.1: Startbildschirm …

B2

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() 

Download