no se puede dibujar elipse en forma de carga en c #

Estoy tratando de dibujar un poco de elipse en un picturebox que contiene un PNG en un formload en c #. Cuando ejecuto el código de abajo, veo mis puntos suspensivos durante medio segundo, luego no los veo más.

Cuando hago clic en mi caja de imágenes, puedo dibujar una elipse; sin embargo, cuando minimizo el formulario, ya no aparecen.

He leído que no debes poner tu código de dibujo en la carga de formularios, sino en el método OnPaint, que es lo que hice. No sé qué intentar más. gracias. (Tenga en cuenta que he dejado un código comentado para mostrar lo que he intentado).

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);
        }*/
    }


}

Respuestas a la pregunta(1)

Su respuesta a la pregunta