2013-11-15 3 views
0

Я пытаюсь нарисовать некоторый эллипс на картинке, который содержит PNG на formload в C#. Когда я выполняю код ниже, я вижу свои эллипсы на полсекунды, и я больше их не вижу.не удается нарисовать эллипс при загрузке формы в C#

Когда я нажимаю на свой фотобарабан, я могу нарисовать эллипс, однако, когда я минимизирую форму, они больше не появляются.

Я читал, что вы не должны помещать свой код рисунка в форму, а скорее в метод OnPaint, что и я сделал. Я не знаю, что попробовать. Спасибо. (Имейте в виду, что я оставил некоторый код, прокомментированный, чтобы показать, что я пробовал).

public partial class FormParterre : Form 
{ 
    Graphics g; 
    float circleSize = 15; 
    //Brushes rouge = new Brushes (Brushes.Red); 

    ReservationBilletSiegeDAO reservationBilletSiegeDAO = new ReservationBilletSiegeDAO(); 
    SiegeDAO siegeDAO = new SiegeDAO(); 

    List <Siege> sieges; 
    List<ReservationBilletSiege> rbs; 
    ReservationBillet reservationBillet = new ReservationBillet(); 
    ReservationBilletSiege reservationBilletSiege; 

    SolidBrush semiTransBrush; 


    public FormParterre() 
    { 
     InitializeComponent(); 
     pictureBox1.Image = new Bitmap("./parterre.png"); 
     g = pictureBox1.CreateGraphics(); 


    } 

    public FormParterre(ReservationBillet rb) 
    { 
     reservationBillet = rb; 
     pictureBox1.Image = new Bitmap("./parterre.png"); 
     g = pictureBox1.CreateGraphics(); 



     InitializeComponent(); 
    } 

    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     // do nothing! prevents flicker 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 

     sieges = siegeDAO.readAll(); 

     rbs = reservationBilletSiegeDAO.readAll(); 

     foreach (ReservationBilletSiege reservationBilletSiegeTMP in rbs) 
     { 
      Console.WriteLine(reservationBilletSiegeTMP.toString()); 
      int x = siegeDAO.read(reservationBilletSiegeTMP.idSiege).xValeur; 
      int y = siegeDAO.read(reservationBilletSiegeTMP.idSiege).yValeur; 
      float xx = (float)x; 
      float yy = (float)y; 
      Console.WriteLine("le x: " + xx); 
      Console.WriteLine("le y: " + yy); 


       /*e.Graphics.FillRectangle(new SolidBrush(BackColor), e.ClipRectangle);*/ 
      g.FillEllipse(new SolidBrush(Color.FromArgb(128, 0, 0, 255)), xx - circleSize/2, yy - circleSize/2, circleSize,          circleSize); 
     } 

    } 

    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     MouseEventArgs me = (MouseEventArgs)e; 
     txtX.Text = me.X.ToString(); 
     txtY.Text = me.Y.ToString(); 

     Console.WriteLine("click"); 

     g.FillEllipse(new SolidBrush(Color.FromArgb(128, 0, 0, 255)), float.Parse(txtX.Text) - circleSize/2, float.Parse(txtY.Text) - circleSize/2, circleSize, circleSize); 





    } 

    private void FormParterre_Shown(object sender, EventArgs e) 
    { 

    } 

    private void FormParterre_Load(object sender, EventArgs e) 
    { 

     /*sieges = siegeDAO.readAll(); 
     //semiTransBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 255)); 



     rbs = reservationBilletSiegeDAO.readAll(); 

     foreach (ReservationBilletSiege reservationBilletSiegeTMP in rbs) 
     { 
      Console.WriteLine(reservationBilletSiegeTMP.toString()); 
      int x = siegeDAO.read(reservationBilletSiegeTMP.idSiege).xValeur; 
      int y = siegeDAO.read(reservationBilletSiegeTMP.idSiege).yValeur; 
      float xx = (float)x; 
      float yy = (float)y; 
      Console.WriteLine("le x: " + xx); 
      Console.WriteLine("le y: " + yy); 

      g.FillEllipse(new SolidBrush(Color.FromArgb(128, 0, 0, 255)), xx - circleSize/2, yy - circleSize/2, circleSize, circleSize); 
     }*/ 
    } 


} 
+4

Не используйте 'CreateGraphics'. Вообще. –

ответ

3

Вы должны рисовать в методе OnPaint используя PaintEventArgs.Graphics свойство, которое передается вам. Если вы хотите нарисовать на PictureBox, вы можете попробовать подписаться на его событие Paint и покрасить там.

Это работает для меня:

public void Form1() 
{ 
    InitializeComponent(); 

    pictureBox1.Paint += pictureBox1_Paint; 
} 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.FillEllipse(Brushes.Red, pictureBox1.ClientRectangle); 
} 
+0

Это звучит глупо, но как я могу «подписаться на событие PaintBox Paint с помощью Visual Studio Designer»? – Eric

+1

Выберите PictureBox. На панели свойств (по умолчанию справа внизу) щелкните значок «Молния». Найдите запись «Краска» и дважды щелкните по пробелу справа от нее. –

+1

Отредактировано также, чтобы показать код на основе подписки на событие. –