2010-11-24 49 views
2

Ma question est liée à la question Stack Overflow Draw lines on a picturebox using mouse clicks in C#, mais lorsque le bouton de la souris est en haut, la ligne tracée disparaît. Comment puis-je réparer ça?Tracer des lignes sur un 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

Veuillez ne pas inclure d'informations sur une langue utilisée dans un titre de question à moins que cela ne soit pas logique sans elle. Les balises servent à cette fin. –

Répondre

0

gainbox.refresh() devrait rester à l'intérieur de la clause if (mouse_dn).

0

Utiliser l'objet Graphics sur la ligne de trait

Graphics gfx = GainBox.CreateGraphics(); 
gfx.Drawline([Your Parameters here]); 
1

Voici un petit programme complet qui fait tracer des lignes en fonction des points (dans ce cas, il suit la souris). Je pense que vous pouvez retravailler cela dans ce dont vous avez besoin.

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

Un problème dans votre solution est que vous dessinez sur un bitmap temporaire, mais l'image que bitmap ne sont jamais transférés à votre PictureBox. Dans la solution présentée ici, il n'y a pas de bitmap supplémentaire nécessaire.

+0

@Fedrick: vous parlez de dessin à main levée ... en fait, je veux changer la forme de la courbe existante .... quand je clique sur un endroit où sur la boîte d'image, la courbe devrait passer par ce point .. (jouer avec courbe d'entrée-sortie de l'image ..) –

+0

@Sisya: l'important dans ma réponse n'est pas comment les points sont acquis mais comment le dessin est effectué. –

+0

@Fedrick: ouais ... en fait, je veux faire glisser (pas dessiner) la ligne dans toute la zone d'image, similaire à [Image-> Réglages-> Courbes] dans photoshop. –