2009-10-08 10 views

Odpowiedz

0

Można to zrobić poprzez uchwycenie mouseMove wydarzenie pole obrazu następnie dostać grafiki z obrazka polu podobnego.

Grafika g = pictureBox.CreateGraphics(); następnie możesz narysować, co chcesz, aby narysować za pomocą tego obiektu graficznego

+0

Eeeeep, Boże, nie! Dostaniesz w ten sposób migotliwą grafikę, jedyną użytecznością dla .CreateGraphics(), o której wiem, jest pomiar ciągów. Zamiast tego chcesz zastąpić OnPaint. – Quibblesome

+0

lub użyj właściwości .Image. Jeśli mamy zamiar wykonać rysunek niestandardowy, to całkowicie zabiję go i odziedziczę po Control. – Quibblesome

20

Umieść PictureBox w formularzu i ustaw jego kolor BackColor na biały. Następnie dodać ten kod do formularza (trzeba faktycznie spięcie zdarzeń myszy poniżej, to znaczy, że nie można po prostu skopiować i wkleić ten kod do formularza):

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

A potem odciągnąć!

Jeśli chcesz, możesz nieco poprawić jakość narysowanego obrazu, ustawiając właściwość obiektu Graphics obiektu SmoothingMode.

Aktualizacja: Net CF nie podlega programowi zbierania Pens i MoustEventArgs nie posiada Location, więc o to CF Wersja:

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

dziękuję za pomoc, ale mam błąd, który nie zna długopisów i e.location – Gold

+0

@Gold: po prostu dodano wersję tej metody zgodną z CF, ponieważ CF nie ma kolekcji długopisów, a MouseEventArgs nie ma Lokalizacja (tylko X i Y). – MusiGenesis

+0

+1 za długą, szczegółową odpowiedź na krótkie, niezbyt dobrze sformułowane pytanie. :) – JYelton

2

Tutaj pictureBox1 == podpis . Przetłumaczyłem VB w ten sposób:

Globalny:

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 
Powiązane problemy