2010-11-15 4 views
1

J'essaye de faire un programme qui dessine des lignes sur un picturebox en utilisant des clics de souris pour les emplacements d'où la ligne doit être dessinée à partir de et vers. Ceci est mon code actuel:Dessiner des lignes sur une image en utilisant des clics de souris dans C#

public partial class Form1 : Form 
{ 
    int Drawshape; 

    private Point p1, p2; 
    List<Point> p1List = new List<Point>(); 
    List<Point> p2List = new List<Point>(); 

    public Form1() 
    { 
     InitializeComponent(); 
     pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Drawshape = 1; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     Drawshape = 2; 
    } 

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (Drawshape == 1) 
     { 
      if (p1.X == 0) 
      { 
       p1.X = e.X; 
       p1.Y = e.Y; 
      } 
      else 
      { 
       p2.X = e.X; 
       p2.Y = e.Y; 

       p1List.Add(p1); 
       p2List.Add(p2); 

       Invalidate(); 
       p1.X = 0; 
      } 
     } 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     Graphics G = Graphics.FromImage(pictureBox1.Image); 
     if (Drawshape == 1) 
     { 
      using (var p = new Pen(Color.Blue, 4)) 
      { 
       for (int x = 0; x < p1List.Count; x++) 
       { 
        G.DrawLine(p, p1List[x], p2List[x]); 
       } 
      } 
     } 
    } 

Pour le moment, cela ne me permet pas du tout de dessiner sur la photo. Comment serait-ce possible?

Répondre

5

changement Invalidate();-pictureBox1.Invalidate();

+0

Et vous devez également créer un gestionnaire de déplacement de souris et appeler pictureBox1.Invalidate(); afin que votre rétroaction de dessin soit immédiate. –

0

Vous devez dessiner chaque ligne sur l'objet Image (en utilisant Graphics.FromImage) après avoir créé la ligne. Vous devez également disposer de l'objet Graphics dans un bloc using.

+0

Ai-je pas fait le Graphics.FromImage dans mon code, ou ai-je écrit ce mal? Aussi, où dois-je disposer les graphiques dans mon code? –

+0

Vous devez disposer les graphiques après l'avoir terminé. Vous ne devriez pas dessiner sur l'image dans l'événement de peinture; vous devriez le dessiner une fois à l'avance. Vous aurez probablement aussi besoin de 'Refresh()' le PictureBox. Si vous voulez le faire à votre façon, vous devez dessiner directement sur un Panel (dans l'événement Paint) sans PictureBox ou Bitmap. – SLaks

+0

Le problème est que je dois le faire sur une imagebox, donc je dois le faire fonctionner sur ce point. Aussi où exactement dans mon code actuel dois-je mettre le picturebox1.refresh() & picturebox1.dispose()? merci –

Questions connexes