невозможно нарисовать эллипс при загрузке формы в С#
-
20-12-2019 - |
Вопрос
Я пытаюсь нарисовать эллипс в графическом поле, содержащем 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);
}