невозможно нарисовать эллипс при загрузке формы в С#

StackOverflow https://stackoverflow.com//questions/20011079

Вопрос

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

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

Я читал, что код рисования следует помещать не в загрузку формы, а в метод 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);
        }*/
    }


}
Это было полезно?

Решение

Вам нужно рисовать в 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top