2017-10-04 4 views
0

Dans mon formulaire, j'ai une image. Je voulais être capable de dessiner des flèches sur une image. J'ai réussi à arriver à mi-chemin là. Dans l'événement de chargement de formulaire, j'assigne une image à la zone d'image. Je suis capable de créer des flèches avec le code ci-dessous. Le problème est que chaque fois que je crée la flèche, l'image que j'ai affectée à mon événement de chargement de formulaire est effacée. Pourquoi mon image est-elle effacée? Comment puis-je conserver l'image que j'ai affectée au chargement du formulaire tout en dessinant des flèches au-dessus?Conserver une image Picturebox pendant que vous la peignez

private bool isMoving = false; 
    private Point mouseDownPosition = Point.Empty; 
    private Point mouseMovePosition = Point.Empty; 
    private List<Tuple<Point, Point>> lines = new List<Tuple<Point, Point>>(); 
    Pen _Pen; 

    private void Test_Load(object sender, EventArgs e) 
    { 
     pictureBox1.Image = Properties.Resources.background;   
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 

     if (isMoving) 
     { 
      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.Clear(pictureBox1.BackColor); 

       AdjustableArrowCap bigArrow = new AdjustableArrowCap(5, 5); 
       _Pen = new Pen(Color.IndianRed, 3); 
       _Pen.CustomEndCap = bigArrow; 
       g.DrawLine(_Pen, mouseDownPosition, mouseMovePosition); 
       _Pen.Dispose(); 
      } 
     } 
    } 



    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     isMoving = true; 
     mouseDownPosition = e.Location; 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (isMoving) 
     { 
      mouseMovePosition = e.Location; 
      pictureBox1.Invalidate(); 
     } 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (isMoving) 
     { 
      lines.Add(Tuple.Create(mouseDownPosition, mouseMovePosition)); 
     } 
     isMoving = false; 
    } 

Je pense que le problème est avec cette ligne ici g.Clear(pictureBox1.BackColor);

Répondre

1

Oui, problème avec cette ligne ici g.Clear(pictureBox1.BackColor); Vous supprimez toute la zone de contrôle avant de tracer la ligne.

Vous devriez attirer e.Graphics directement:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (isMoving) 
    { 
     if (pictureBox1.Image == null) e.Graphics.Clear(Color.White); 

     // Add this line for high quality drawing: 
     e.Graphics.SmoothingMode = SmoothingMode.HighQuality; 

     AdjustableArrowCap bigArrow = new AdjustableArrowCap(5, 5); 
     _Pen = new Pen(Color.IndianRed, 3); 
     _Pen.CustomEndCap = bigArrow; 
     e.Graphics.DrawLine(_Pen, mouseDownPosition, mouseMovePosition); 
     _Pen.Dispose(); 
    } 
} 
+0

Salut Sakura, cela a fonctionné. Je vous remercie! Cela préserve l'image d'arrière-plan et dessine des flèches, mais savez-vous pourquoi l'image de la vignette n'est pas égale à la flèche dessinée au-dessus de l'image de fond? La façon dont j'ai testé cela a été de mettre un autre contrôle de la boîte à images dans mon formulaire et j'ai juste écrit 'picturebox2.image = picturebox1.image' et il n'affichait que mon image de fond. – taji01

+0

Modifiez 'if (pictureBox1.Image == null)' en if ((expéditeur en tant que PictureBox) .Image == null) '. De toute façon, je ne comprends pas clairement votre commentaire. Si possible, éditez votre question avec un nouveau code et je verrai si je peux aider – Sakura

+0

Salut Sakura, j'ai posé la question ici plus en détail avec des tests que j'ai courus. https://stackoverflow.com/questions/46592322/paint-drawline-image-into-picturebox-image – taji01