Dessiner une grid sur un PictureBox

Je travaille actuellement avec un PictureBox. J’ai des difficultés à dessiner sur la boîte à images une grid d’environ la taille de 2 x 2 carrés. Maintenant, le code ci-dessous me donne seulement une ligne tracée. Comment puis-je proplery dessiner une grid complète en haut de la PictureBox?

CODE:

private Graphics g1; public Form1() { InitializeComponent(); pictureBox1.Image = new Bitmap(500, 500); g1 = Graphics.FromImage(this.pictureBox1.Image); Pen gridPen = new Pen(Color.Black, 2); g1.DrawLine(gridPen, 0, 0, 100, 100); } 

C’est ce que j’aimerais accomplir: entrez la description de l'image ici

J’ai trouvé cette question: dessiner efficacement une grid dans Windows Forms

En voici l’essentiel:

 private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; int numOfCells = 200; int cellSize = 5; Pen p = new Pen(Color.Black); for (int y = 0; y < numOfCells; ++y) { g.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize); } for (int x = 0; x < numOfCells; ++x) { g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize); } } 

Personnaliser en conséquence

La réponse acceptée de MikeB est, bien sûr, correcte, mais le PO était toujours confus et les gens le voient toujours. J’ajoute donc une réponse plus précise (oui, 8 ans plus tard).

La méthode de Mike

 private void pictureBox1_Paint(object sender, PaintEventArgs e) 

est une méthode autonome qui doit être appelée au bon moment. Pour ce faire, vous devez l’enregistrer auprès du répartiteur d’événements OnPaint afin qu’il soit appelé chaque fois qu’un événement OnPaint se produit. Pour ce faire, placez la ligne suivante à un endroit pratique, comme dans le constructeur de votre classe:

 OnPaint += pictureBox1_Paint; 

Cette approche est acceptable, mais si vous arrivez là où vous avez vraiment besoin de performances de dessin, cela vous fera mal, car cela coûtera plus cher pour que PaintEventArgs soit construit et transmis à vous. Une meilleure approche consiste à remplacer la méthode OnPaint de la classe parente et à placer votre code de dessin directement dans la méthode OnPaint. De cette façon, vous n’aurez pas à vous connecter à des gestionnaires d’événements et cela fonctionnera plus rapidement. Le code a presque la même apparence:

 protected override void OnPaint (PaintEventArgs e) { Graphics g = e.Graphics; int numOfCells = 200; int cellSize = 5; Pen p = new Pen(Color.Black); for (int y = 0; y < numOfCells; ++y) { g.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize); } for (int x = 0; x < numOfCells; ++x) { g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize); } } 

Une dernière suggestion: dessiner dans un contrôle PictureBox n’est presque jamais une bonne idée. Beaucoup de gens le font, mais peu d'experts le feraient de cette façon. Ils n'ont pas été conçus pour être des canevas de dessin - ils héritent simplement de la même fonctionnalité que tous les contrôles basés sur des formulaires - et ils ajoutent de la complexité et vous ralentissent sans aucune fonctionnalité utile. Vous serez plus heureux si vous vous débarrassez des boîtes à images et dessinez simplement sur le formulaire ou le panneau contenant votre boîte à images.