2011-05-09 21 views
5

Mam wiele zdjęć i ich współrzędne o szerokości i wysokości. Zdjęcie jest umieszczane w skrzynce obrazkowej i wysyłam współrzędne, aby narysować na nim prostokąt. Na panelu znajduje się wiele ramek graficznych.C# rysowanie prostokąta na obrazku?

Wysyłam ich ścieżki do klasy PicturePanel również z pewnymi współrzędnymi i właściwościami szerokości/wysokości, aby narysować prostokąt. Jednak moim problemem jest to, że rysuje i natychmiast usuwa. Jeśli nie umieszczę skrzynki po każdym obrazie, nie widzę prostokątów. Oto kod;

if (IsRun()) 
{ 
    MessageBox.Show("rontool true"); 

    Rectangle ee = drawARectangle(xCoor, yCoor, MainScreen.tempR.wid/ratioOfx, MainScreen.tempR.heig/ratioOfy); // I wrote this, it only creates and returns the rectangle. 
    //MessageBox.Show("x : " + xCoor + " y: " + yCoor + " width : " + (MainScreen.tempR.wid/ratioOfx) + " height: " + (MainScreen.tempR.heig/ratioOfy)); 
    using (Pen pen = new Pen(Color.Red, 2)) 
    { 
     pictureBox.CreateGraphics().DrawRectangle(pen, ee); 
     // e.Graphics.DrawRectangle(pen, ee); 
    } 
} 

Jest to

private void PictureBox_Paint(object sender, PaintEventArgs e). 

dla pętli w innej klasy tworzy pictureBox i inicjalizacji x, y itd. Jednakże, zwraca i natychmiast usuwa się. lub czasami nawet nie rysuje.

Jeśli po każdym obrazie nie umieszczam skrzynki po wiadomościach, nie widzę nawet prostokątów. Możesz mi pomóc?

Odpowiedz

3

Sposób malowania PictureBox jest wywoływana, gdy system Windows chce ci pomaluj swoje pudełko na zdjęcia. Wygląda na to, że rysujesz tylko prostokąt przez pewien czas.

if (IsRun()) 

Zmień kod, aby zawsze wykonywać swój rysunek.

tj. Ten kod nie narysuje prostokąta. gdzie będzie przykład Bena.

private bool _once = true; 

     private void pictureBox1_Paint(object sender, PaintEventArgs e) 
     { 
      if (_once) 
      { 
       Rectangle ee = new Rectangle(10, 10, 30, 30); 
       using (Pen pen = new Pen(Color.Red, 2)) 
       { 
        e.Graphics.DrawRectangle(pen, ee); 
       } 
       _once = false; 
      } 
     } 
3

nie jestem pewien, że w pełni rozumiem pytanie, ale jeśli chcesz to, aby narysować prostokąt, następujący kod będzie to zrobić:

Private void pictureBox_Paint(object sender, PaintEventArgs e) { 
     Rectangle ee = new Rectangle(10, 10, 30, 30);   
     using (Pen pen = new Pen(Color.Red, 2)) { 
      e.Graphics.DrawRectangle(pen, ee); 
     } 
    } 
+0

Wywołuję go w pętli for, więc prostokąty znikają. – Ada

+0

Będziesz musiał pokazać więcej kodu, niż zrobiłeś w swoim pytaniu. Dokładniej, co dzieje się w tej pętli. – Ben

0

Zobacz kod poniżej. Dodałem prostokąt zamiast zdjęcia tylko po to, aby zademonstrować kod:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     const int ROWS = 3; 
     const int COLUMNS = 4; 
     const int WIDTH = 10; 
     const int HEIGHT = 20; 
     const int SPACE = 10; 
     public Form1() 
     { 
      InitializeComponent(); 
      Panel panel = new Panel(); 
      panel.Width = COLUMNS * (WIDTH + SPACE); 
      panel.Height = ROWS * (HEIGHT + SPACE); 
      this.Controls.Add(panel); 
      for (int rows = 0; rows < ROWS; rows++) 
      { 
       for (int cols = 0; cols < COLUMNS; cols++) 
       { 
        PictureBox newPictureBox = new PictureBox(); 
        newPictureBox.Width = WIDTH; 
        newPictureBox.Height = HEIGHT; 
        newPictureBox.Top = rows * (HEIGHT + SPACE); 
        newPictureBox.Left = cols * (WIDTH + SPACE); 
        panel.Controls.Add(newPictureBox); 
        newPictureBox.Paint +=new PaintEventHandler(pictureBox_Paint); 

       } 
      } 
     } 
     private void pictureBox_Paint(object sender, PaintEventArgs e) { 
      Rectangle ee = new Rectangle(0, 0, WIDTH, HEIGHT);   
      using (Pen pen = new Pen(Color.Red, 2)) { 
       e.Graphics.DrawRectangle(pen, ee); 
      } 
     } 
    } 
}