2009-10-08 7 views

Antwort

0

Sie es dann Grafiken wie von Bildfeld erhalten, indem der Erfassung des mousemove- Ereignisses von Bildfeld tun.

Grafik g = pictureBox.CreateGraphics(); dann können Sie zeichnen, was Sie zeichnen möchten mit diesem Grafikobjekt

+0

Eeeeep, Gott nein! Auf diese Weise erhalten Sie flockige Grafiken, der einzige Anwendungsfall für .CreateGraphics(), den ich kenne, ist das Messen von Strings. Sie möchten stattdessen OnPaint überschreiben. – Quibblesome

+0

oder verwenden Sie die .Image-Eigenschaft. Wenn wir eine benutzerdefinierte Zeichnung erstellen, würde ich die Picturebox vollständig löschen und stattdessen von Control erben. – Quibblesome

20

Setzen Sie eine PictureBox auf Ihr Formular, und legen Sie die BackColor auf Weiß. Dann fügen Sie diesen Code in das Formular (Sie haben tatsächlich die Mausereignisse unten anschließen, das heißt man kann nicht einfach kopieren und diesen Code in das Formular einfügen):

private Point? _Previous = null; 
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    _Previous = e.Location; 
    pictureBox1_MouseMove(sender, e); 
} 
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (_Previous != null) 
    { 
     if (pictureBox1.Image == null) 
     { 
      Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
      using (Graphics g = Graphics.FromImage(bmp)) 
      { 
       g.Clear(Color.White); 
      } 
      pictureBox1.Image = bmp; 
     } 
     using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 
     { 
      g.DrawLine(Pens.Black, _Previous.Value, e.Location); 
     } 
     pictureBox1.Invalidate(); 
     _Previous = e.Location; 
    } 
} 
private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
{ 
    _Previous = null; 
} 

Und dann ziehen weg! Wenn Sie möchten, können Sie die Qualität des gezeichneten Bildes etwas verbessern, indem Sie die Eigenschaft Graphics Objekt SmoothingMode setzen.

Update: .Net CF die Pens Sammlung does't haben, und MoustEventArgs hat kein Location, ist so hier eine CF-Version:

private Point? _Previous = null; 
private Pen _Pen = new Pen(Color.Black); 
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    _Previous = new Point(e.X, e.Y); 
    pictureBox1_MouseMove(sender, e); 
} 
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (_Previous != null) 
    { 
     if (pictureBox1.Image == null) 
     { 
      Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
      using (Graphics g = Graphics.FromImage(bmp)) 
      { 
       g.Clear(Color.White); 
      } 
      pictureBox1.Image = bmp; 
     } 
     using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 
     { 
      g.DrawLine(_Pen, _Previous.Value.X, _Previous.Value.Y, e.X, e.Y); 
     } 
     pictureBox1.Invalidate(); 
     _Previous = new Point(e.X, e.Y); 
    } 
} 
private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
{ 
    _Previous = null; 
} 
+0

danke für die Hilfe, aber ich habe Fehler, die nicht wissen Stifte und e.location – Gold

+0

@Gold: nur eine CF-freundliche Version dieser Methode hinzugefügt, da CF nicht die Pens-Sammlung und MouseEventArgs hat nicht ein Ort (nur X und Y). – MusiGenesis

+0

+1 für eine lange, detaillierte Antwort auf eine kurze, nicht so gut formulierte Frage. :) – JYelton

2

Hier PictureBox1 == Unterschrift . Ich übersetzte auf diese Weise vb:

Global:

Dim _previous As Point = Nothing 
Dim _pen As Pen = New Pen(Color.Black) 
Dim drawing As Boolean = False 


''' <summary> 
''' This handles the signature drawing events (drawing) 
''' </summary> 
''' <param name="sender"></param> 
''' <param name="e"></param> 
''' <remarks></remarks> 
Private Sub signature_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles signature.MouseMove 
    If drawing = True Then 
     If signature.Image Is Nothing Then 
      Dim bmp As Bitmap = New Bitmap(signature.Width, signature.Height) 

      Using g As Graphics = Graphics.FromImage(bmp) 
       g.Clear(Color.White) 
      End Using 

      signature.Image = bmp 
     End If 

     Using g As Graphics = Graphics.FromImage(signature.Image) 
      g.DrawLine(_pen, _previous.X, _previous.Y, e.X, e.Y) 
     End Using 
     signature.Invalidate() 
     _previous = New Point(e.X, e.Y) 
    End If 
End Sub 

''' <summary> 
''' this indicates somebody is going to write a signature 
''' </summary> 
''' <param name="sender"></param> 
''' <param name="e"></param> 
''' <remarks></remarks> 
Private Sub signature_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles signature.MouseDown 
    _previous = New Point(e.X, e.Y) 
    drawing = True 
    signature_MouseMove(sender, e) 

End Sub 

''' <summary> 
''' the signature is done. 
''' </summary> 
''' <param name="sender"></param> 
''' <param name="e"></param> 
''' <remarks></remarks> 
Private Sub signature_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles signature.MouseUp 
    _previous = Nothing 
    drawing = False 
End Sub 
Verwandte Themen