2010-04-28 4 views

Répondre

-1

le picturebox est un contrôle et a une image en tant que source - donc vous devez tirer sur l'image et la main l'image au contrôle de le montrer

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

Ceci dessine __into un bitmap__, pas __à l'imagebox__. Cela fonctionne mais c'est tout à fait différent! – TaW

2

La meilleure façon est de ne pas tracer un cercle et de la ligne dans un picturebox! Ce n'est pas conçu à cette fin.

Du GDI + blog de Bob Powell:

La racine de ce problème est que les règles fondamentales des fenêtres programmation ont été brisées. Et comme conséquence de la zone d'image est blâmé pour quelque chose qui est vraiment pas sa faute. Pour expliquer pourquoi , les quatre points ci-dessous les grandes lignes ce qui a mal tourné dans ce cas.

  • Le contrôle PictureBox permet d'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 géré dans le bon contexte et les événements destinés à gérer les clics de souris ou les mouvements de souris ne doivent pas être utilisés pour dessiner sur un écran ou d'autres choses bizarres.

  • Le PictureBox se rafraîchit en tirant l'objet en fonction System.Drawing.Image stocké dans sa propriété d'image. S'il n'y a pas d'image, il montrera la couleur de fond.

  • Voler et dessiner sur l'objet Graphics de n'importe quel contrôle n'est pas une bonne pratique, devrait ê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. Quand vous vous frappez la tête contre un mur, cela vous fait mal. c'est un signe que vous devriez arrêter de le faire. C'est la même chose pour l'appel de PictureBox.CreateGraphics.

La bonne façon de le faire.

Suivre les règles du système piloté par l'événement est facile, mais nécessite un peu de prévoyance . Donc, si vous voulez dessiner un petit peu de graphiques et l'avez rester là quand une fenêtre se déplace devant lui et encore là ou quand vous minimisez et restaurez, vous devez entretenir l'événement Paint de quel que soit l'objet que vous souhaitez peindre. Le PictureBox porte bagages avec elle qui est inutile pour ce genre d'application. Si vous voulez simplement dessiner quelque chose dans 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 service son événement Paint. Si vous souhaitez que duplique un graphique à plusieurs reprises pour votre image d'entreprise, créez un contrôle et effectuez le dessin dans le remplacement OnPaint.

Lien original (pas plus valide): http://bobpowell.net/picturebox.htm

NOTE: Le lien d'origine sur le blog de Bob Powell ne fonctionne plus. 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) à la date à laquelle ce post a été modifié.

+2

+1 C'est vraiment la bonne réponse. Merci pour le lien, qui décrit le problème racine. – Sabuncu

+8

-1 "Linkrot" ... et cette réponse ne donne que peu d'indications sur ce qu'est le problème ou quoi faire à la place. "Les liens vers des ressources externes sont encouragés, mais veuillez ajouter le contexte autour du lien afin que vos autres utilisateurs aient une idée de ce que c'est et de la raison pour laquelle ils sont inclus. inaccessible ou va définitivement hors ligne. " Source: http://stackoverflow.com/help/how-to-answer J'ai cependant trouvé les pages bobpowell conservées dans la "Wayback Machine": https://web.archive.org/web/20120216111903/http: //bobpowell.net/picturebox.htm –

+0

Ceci est une réponse terrible. Les pages (sinon superbes) de Bobpowell ne sont pas seulement disparues mais ne suggèrent en aucun cas que vous ne devriez pas dessiner sur un PictureBox. En fait, leur DoubleBuffering par défaut en fait les seuls contrôles qui conviennent à la sortie de la boîte. Bob met simplement en garde contre l'utilisation de la copie de '' Control.CreateGraphics' 'de tous les newbies rédigée de la page d'exemple de débuts de MSDN aussi terrible. – TaW

24

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érer l'événement de peinture de la zone d'image et faites votre dessin personnalisé là-bas.

Questions connexes