2009-10-08 8 views

Répondre

0

Vous pouvez le faire en capturant l'événement MouseMove de zone d'image alors obtenir des graphiques de zone d'image comme.

Graphiques g = pictureBox.CreateGraphics(); puis vous pouvez dessiner ce que vous voulez dessiner en utilisant cet objet graphique

+0

Eeeeep, dieu non! Vous obtiendrez des graphismes flickery de cette façon, la seule utilisation pour .CreateGraphics() que je connais est de mesurer les chaînes. Vous voulez remplacer OnPaint à la place. – Quibblesome

+0

ou utilisez la propriété .Image. Si nous allons faire du dessin personnalisé, je tuerais complètement Picturebox et hériterais de Control à la place. – Quibblesome

20

Placez un PictureBox sur votre formulaire et définissez sa BackColor sur blanc. Ensuite, ajoutez ce code à votre formulaire (vous devez réellement brancher les événements de souris ci-dessous, à savoir que vous ne pouvez pas simplement copier et coller ce code dans votre formulaire):

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; 
} 

Et puis tirer loin! Si vous le souhaitez, vous pouvez améliorer la qualité de l'image dessinée en définissant la propriété SmoothingMode de l'objet Graphics.

Mise à jour: .Net CF does't ont la collection Pens et MoustEventArgs ne dispose pas d'un Location, alors voici une version CF-friendly:

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

merci pour l'aide, mais j'ai eu erreur qui ne sait pas stylos et e.location – Gold

+0

@ Or: juste ajouté une version CF-friendly de cette méthode, car CF n'a pas la collection Pens et MouseEventArgs n'a pas un emplacement (juste X et Y). – MusiGenesis

+0

+1 pour une réponse longue et détaillée à une question courte, pas très bien formulée. :) – JYelton

2

Ici, pictureBox1 signature == . Je traduis Vb de cette manière:

mondiale:

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 
Questions connexes