문제

C#의 폼로드에 PNG가 포함된 그림 상자에 타원을 그리려고 합니다.아래 코드를 실행하면 타원이 0.5초 동안 표시되었다가 더 이상 표시되지 않습니다.

내 그림 상자를 클릭하면 타원을 그릴 수 있지만 양식을 최소화하면 더 이상 나타나지 않습니다.

드로잉 코드를 formload에 넣지 말고 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