2010-06-01 7 views
2

J'ai dessiné et sauvegardé le Rectangle sur l'image que j'ai chargée dans la boîte d'image. Comment j'aime dessiner plusieurs rectangles pour que j'ai essayé tableau dans le rectangle, mais il donne l'erreur (« référence d'objet non définie à une instance d'un objet. » (Référence nulle exception non gérée).Comment dessiner plusieurs rectangles en utilisant C#

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (mybitmap == null) 
    { 
     mybitmap = new Bitmap(sz.Width, sz.Height); 
    } 
    rect[count] = new Rectangle(e.X, e.Y, 0, 0); 
    this.Invalidate(); 
} 

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (stayToolStripMenuItem.Checked == true) 
    { 
     switch (e.Button) 
     { 
      case MouseButtons.Left: 
      { 
       rect[count] = new Rectangle(rect[count].Left, rect[count].Top, e.X - rect[count].Left, e.Y - rect[count].Top); 
       pictureBox1.Invalidate(); 
       count++: 
       break; 
      }  
     } 
    } 
} 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (stayToolStripMenuItem.Checked == true) 
    { 
     button1.Visible = true; 
     button2.Visible = true; 

     if (mybitmap == null) 
     { 
      return; 
     } 

     using (g = Graphics.FromImage(mybitmap)) 
     { 
      using (Pen pen = new Pen(Color.Red, 2)) 
      { 
       //g.Clear(Color.Transparent); 
       e.Graphics.DrawRectangle(pen, rect); 
       label1.Top = rect[count].Top; label1[count].Left = rect[count].Left; label1.Width = rect[count].Width; 
       label1.Height = rect[count].Height; 

       if (label1.TextAlign == ContentAlignment.TopLeft) 
       { 
        e.Graphics.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect); 
        g.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect); 
        g.DrawRectangle(pen, rect[count]); 
       } 
      } 
     } 
    } 
} 

Comment Je le fais .....

+2

Quelle erreur donne-t-elle? –

+0

quelqu'un va-t-il formater le code? – Amsakanna

+0

@Ardman: Merci! et vous l'avez fait avant que j'ai commenté :) – Amsakanna

Répondre

0

Modifiez légèrement le code. Au lieu de l'événement de déplacement de la souris, cliquez sur Événement clic de souris.

Lors de l'utilisation de l'événement de déplacement de souris, il appelle à chaque fois que la souris se déplace sur la zone d'image. donc le nombre de rectangle de liste est augmenté. Pour cela, j'ai utilisé l'événement de clic de souris. Lorsque le rectangle de liste est ajouté dans l'événement Souris, il obtient uniquement les valeurs de hauteur et de largeur du rectangle (if use (0,0,e.X,e.Y)) et le rectangle commence toujours dans le coin supérieur gauche (impossible de démarrer le point rectangle que l'utilisateur aime) il est seulement obtient X et Y valeurs (if use(e.X, e.Y,0,0))

à venir sur ce que j'ai utilisé le rectangle de liste en cas de clic de souris, donc je reçois toutes les valeurs.

List<Rectangle> rectangles = new List<Rectangle>(); 

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (stayToolStripMenuItem.Checked == true) 
     { 

      if (mybitmap == null) 
      { 
       mybitmap = new Bitmap(sz.Width, sz.Height); 

      } 
      rect = new Rectangle(e.X, e.Y, 0, 0); 
      this.Invalidate(); 

     } 

    } 


    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     if (stayToolStripMenuItem.Checked == true) 
     { 
      button1.Visible = true; 
      button2.Visible = true; 

      if (mybitmap == null) 
      { 
       return; 
      } 


       using (g = Graphics.FromImage(mybitmap)) 
       { 

        using (Pen pen = new Pen(Color.Red, 2)) 
        { 
         //g.Clear(Color.Transparent); 


         e.Graphics.DrawRectangle(pen, rect); 
         label1.Top = rect.Top; label1.Left = rect.Left; label1.Width = rect.Width; 
         label1.Height = rect.Height; 


         if (label1.TextAlign == ContentAlignment.TopLeft) 
         { 
          e.Graphics.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect); 
          g.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect); 
          g.DrawRectangle(pen, rect); 

         } 

        } 

       } 

private void pictureBox1_MouseClick(object sender, MouseEventArgs e) 
    { 

      if (e.Button == MouseButtons.Left) 

      { 
       rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y - rect.Top); 
       rectangles.Add(rect); 
       pictureBox1.Invalidate(); 
       f = 0; 

      } 


    } 

Quel rectangle jamais je dessine s'enregistré dans les rectangles de liste et être sauvé quand je sauvé le travail (pouvait voir tous les rectangles dessinés quand je l'ai ouvert le fichier enregistré).

Maintenant, le problème est que lorsque je dessine un nouveau rectangle, le précédent a disparu (à l'exécution, mais cela a été ajouté dans le rectangle de la liste). Comment afficher tous les rectangles dessinés sur l'exécution, de sorte que l'utilisateur peut savoir combien de rectangles sont dessinés et où.

3

vous incrémenter la variable count après le remplissage du tableau rect. au moment où pictureBox1_Paint est exécuté, cette augmentation a déjà eu lieu, donc rect[count] est maintenant une référence null, ce qui vous alors essayer de dessiner :)

Aussi, il semble y avoir une compilation erreur er dans pictureBox1_MouseDown. Le count++ à l'intérieur de l'instruction switch n'appartient à aucun bloc case. Placez-le avant l'instruction break;.

J'imagine votre intention est quelque chose comme ceci:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (mybitmap == null) 
     return; 

    using (g = Graphics.FromImage(mybitmap)) 
    using (Pen pen = new Pen(Color.Red, 2)) 
    { 
     g.Clear(Color.Transparent); 

     for (int i = 0; i < count; i++) 
     { 
      // Code to draw rect[i], instead of rect[count] 
     } 
    } 
} 

Quelle est votre tableau rect, par le chemin? Les tableaux ne grandissent pas automatiquement pour répondre à vos besoins. Vous pouvez regarder à l'aide de List<Rectangle> à la place.

+0

ont mis le nombre ++ avant l'instruction de rupture. Si j'essaie de faire une boucle dans la peinture, dessinez le rectangle l'un sur l'autre (à la même position). J'aime dessiner plus d'un rectangle dans une position différente. En utilisant le code ci-dessus, il dessinera le rectangle et si je change de position (comme pour dessiner un autre point), le rectangle précédent disparaîtra. Comment je reçois le plus un rectangle ....veuillez nous conseiller – Nivas

+0

@Nivas: dans votre nouveau code, vous n'augmentez pas 'count' n'importe où, donc il continuera à utiliser l'élément 0 du tableau' rect'. Ainsi, le rectangle précédent est écrasé. – Thorarin

+0

oups j'ai raté une ligne. va incrémenter le compte dans l'instruction switch. S'il vous plaît me conseiller ... – Nivas

Questions connexes