web-dev-qa-db-fra.com

Comment dessiner un cercle et une ligne dans le Picturebox?

Comment dessiner un cercle et une ligne dans le Picturebox?

14
Alexry

le Picturebox est un contrôle et a une image comme source - vous devez donc dessiner sur l'image et remettre l'image au contrôle pour l'afficher

MyImage = new Bitmap(fileToDisplay);
pictureBox1.ClientSize = new Size(xSize, ySize);
pictureBox1.Image = MyImage;
0
Gambrinus

ou:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawLine(
            new Pen(Color.Red,2f), 
            new Point(0,0), 
            new Point(pictureBox1.Size.Width, pictureBox1.Size.Height ));

        e.Graphics.DrawEllipse(
            new Pen(Color.Red, 2f),
            0,0, pictureBox1.Size.Width, pictureBox1.Size.Height  );
    }

Gérez l'événement Paint de la zone d'image et effectuez votre dessin personnalisé à cet endroit.

29
Paul Sasik

Le meilleur moyen est de NE PAS dessiner un cercle et une ligne dans une boîte à images! Il n'est pas conçu à cette fin.

Du blog GDI + de Bob Powell:

La racine de ce problème est que les règles fondamentales de la programmation Windows ont été enfreintes. Et en conséquence, la boîte à images est blâmée pour quelque chose qui n'est vraiment pas de sa faute. Pour expliquer pourquoi, les quatre points ci-dessous décrivent ce qui ne va pas dans ce cas.

  • Le contrôle PictureBox sert à afficher des images. Ce n'est pas un espace réservé pratique pour une surface graphique.

  • Windows est un système événementiel dans lequel chaque événement doit être traité dans le bon contexte et les événements destinés à gérer les événements de clic de bouton ou de déplacement de souris ne doivent pas être utilisés pour dessiner à l'écran ou d'autres choses étranges.

  • Le PictureBox s'actualise en dessinant l'objet basé sur System.Drawing.Image stocké dans sa propriété Image. S'il n'y a pas d'image, il affichera la couleur d'arrière-plan.

  • Voler et tirer sur l'objet graphique de tout contrôle n'est pas une bonne pratique, doit être fortement déconseillé et enfreint les règles de gestion des événements au bon endroit au bon moment. Fondamentalement, si vous faites cela, cela vous causera de la douleur. Lorsque vous vous cognez la tête contre un mur, cela vous fait mal. c'est un signe que vous devriez arrêter de le faire. Il en va de même pour l'appel PictureBox.CreateGraphics.

La bonne façon de le faire.

Suivre les règles du système événementiel est facile mais nécessite un peu de prévoyance. Donc, si vous voulez dessiner un petit peu de graphiques et les faire rester là lorsqu'une fenêtre se déplace devant elle et s'éloigne à nouveau ou lorsque vous minimisez et restaurez, vous devez traiter l'événement Paint de l'objet que vous souhaitez. à peindre. La PictureBox transporte des bagages qui ne sont pas nécessaires pour ce type d'application. Si vous souhaitez simplement dessiner quelque chose à un endroit, dessinez-le sur le formulaire en répondant à l'événement Form.Paint. Si vous voulez un espace réservé pratique pour un graphique qui fonctionne dans un ensemble de limites, utilisez un contrôle Panel et réparez son événement Paint. Si vous souhaitez dupliquer un graphique à plusieurs reprises pour votre image d'entreprise, créez un contrôle et effectuez le dessin dans le remplacement OnPaint.

Lien d'origine (plus valide): http://bobpowell.net/picturebox.htm

REMARQUE: le lien d'origine vers le blog de Bob Powell n'est plus fonctionnel. Je l'ai laissé ici à des fins historiques. Le contenu de la page peut toujours être consulté sur l'archive Internet ( https://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm ) à partir du date à laquelle ce message a été modifié.

5
Chris Dunaway
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Asssignment
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)
        { 
            Graphics g = this.CreateGraphics();
            Pen p = new Pen(Color.Blue);
            int radius = 200;
            int x =Width/2;
            int y =Height/2;


            int first_point1 = (int)(Math.Cos(0) * radius + x);
            int first_point2 = (int)(Math.Sin(0) * radius + y);

            Point p1= new Point(first_point1,first_point2);
            for(int i=1;i<500; i++)
            {
                int dx = (int)(Math.Cos(i)*radius+x );
                int dy = (int)(Math.Sin(i)*radius+y );
                Point p2 = new Point(dx, dy);
                g.DrawLine(p, p1, p2);
                p1 = p2;
            }
        }
    }
}
0