2010-11-24 6 views
2

Meine Frage bezieht sich auf Stack Overflow Frage Draw lines on a picturebox using mouse clicks in C#, aber wenn die Maustaste gedrückt ist, verschwindet die gezeichnete Linie. Wie behebe ich das?Zeichnen Sie Linien auf einer PictureBox

private void GainBox_MouseDn(object sender, MouseEventArgs e) 
{ 
    mouse_dn = true; 
} 

private void GainBox_MouseMv(object sender, MouseEventArgs e) 
{ 
    //Line drawn from lookup table 
    if (mouse_dn) 
    { 
     img = new Bitmap(256, 256); 

     //Get the coordinates (x, y) for line from lookup table. 

     for (x = x1; x < x2; x++) 
      img.SetPixel(x, y, Color.Red); 

     //Same for y coordinate 
    } 
    GainBox.Refresh(); 
} 

private void GainBox_MouseUp(object sender, MouseEventArgs e) 
{ 
    mouse_dn = false; 
} 
+0

Bitte geben Sie keine Informationen zu einer Sprache an, die in einem Fragentitel verwendet wird, es sei denn, es würde ohne sie keinen Sinn ergeben. Tags dienen diesem Zweck. –

Antwort

0

gainbox.refresh() sollte in der if (mouse_dn) Klausel bleiben.

0

Verwenden Sie ein Grafikobjekt zum Zeichnen einer Linie

z.

1

Hier ist ein kleines komplettes Programm, das Linien basierend auf Punkten zeichnet (in diesem Fall folgt es der Maus). Ich denke, Sie können das in das umsetzen, was Sie brauchen.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 


    // Variable that will hold the point from which to draw the next line 
    Point latestPoint; 


    private void GainBox_MouseDown(object sender, MouseEventArgs e) 
    { 
     if ((e.Button & MouseButtons.Left) == MouseButtons.Left) 
     { 
      // Remember the location where the button was pressed 
      latestPoint = e.Location; 
     } 
    } 

    private void GainBox_MouseMove(object sender, MouseEventArgs e) 
    { 
     if ((e.Button & MouseButtons.Left) == MouseButtons.Left) 
     { 
      using (Graphics g = GainBox.CreateGraphics()) 
      { 
       // Draw next line and... 
       g.DrawLine(Pens.Red, latestPoint, e.Location); 

       // ... Remember the location 
       latestPoint = e.Location; 
      } 
     } 
    } 
} 

Ein Problem in Ihrer Lösung ist, dass Sie auf einer temporären Bitmap zeichnen, aber das Bild in dieser Bitmap wird nie auf Ihre PictureBox übertragen. In der hier vorgestellten Lösung ist keine zusätzliche Bitmap erforderlich.

+0

@Fedrick: du sprichst über freie Hand Zeichnung ... eigentlich möchte ich die Form der vorhandenen Kurve ändern .... wenn ich auf etwas wo auf Bildfeld klicke, sollte die Kurve durch diesen Punkt gehen .. (spielt mit Input-Output-Kurve des Bildes ..) –

+0

@Sisya: die wichtige Sache in meiner Antwort ist nicht, wie die Punkte erworben werden, sondern wie die Zeichnung durchgeführt wird. –

+0

@Fedrick: yeah..actually möchte ich die Linie über die Bildbox ziehen (nicht zeichnen), ähnlich wie [Bild-> Anpassungen-> Kurven] in Photoshop. –