Windows Forms - не будет рисовать шар - PullRequest
0 голосов
/ 19 мая 2018

Итак, я играю с формами Windows в Visual Studio и пытаюсь создать простую программу, которая просто рисует шарик, используя класс Graphics.

Вот коддля класса мяча:

public class Ball
{
    public Point centre { get; set; }
    public int state { get; set; }
    public static int radius = 40;

    public void Draw(Graphics g)
    {
        Brush brush;
        brush = new SolidBrush(Color.White);
        if(state==0)
        {
           brush = new SolidBrush(Color.Green);
        }
        if(state==1)
        {
            brush = new SolidBrush(Color.Blue);
        }
        if(state==2)
        {
            brush = new SolidBrush(Color.Red);
        }
        g.FillEllipse(brush, centre.X - radius, centre.Y - radius, 2 * radius, 2 * radius);
    }

    public void Move(Point centre)
    {
        this.centre = centre;
    }
}

А вот класс для основной программы:

public partial class Form1 : Form
{
    public Ball ball { get; set; }
    public Form1()
    {
        InitializeComponent();
        ball = new Ball();
        this.Width = 500;
        this.Height = 500;
        ball.centre = new Point(250, 250);
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        ball.state = 1;
        ball.Draw(g);
    }
}

Однако всякий раз, когда я запускаю программу, она успешно работает безошибки, но ничего не рисует.

Есть идеи?

1 Ответ

0 голосов
/ 19 мая 2018

Я сделал несколько изменений в классе Ball для управления List<Color>, чтобы можно было добавить больше цветов во время выполнения, некоторые свойства по умолчанию и поддержку IDisposable.

Также улучшено качество рендеринга с использованием Graphics.SmoothingMode , установленным на AntiAlias и Graphics.CompositingQuality , установленным на HighQuality.

public class Ball : IDisposable
{
    private SolidBrush brush = null;
    private int PrivateState = 0;

    public Ball()
        : this(new Point(40, 40)) { }

    public Ball(Point InitialPosition)
    {
        this.FillColorList();
        this.Centre = InitialPosition;
        this.Radius = 40;
        this.brush = new SolidBrush(this.Colors[this.PrivateState]);
    }

    public Point Centre { get; set; }
    public int State {
        get { return this.PrivateState; }
        set { this.PrivateState = (value < this.Colors.Count) ? value : 0; }
    }
    public int Radius { get; set; }
    public List<Color> Colors { get; set; }

    private void FillColorList()
    {
        this.Colors = new List<Color>() { Color.White, Color.Green, Color.Blue, Color.Red };
    }

    public void Draw(Graphics g)
    {
        this.brush.Color = this.Colors[this.PrivateState];
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.CompositingQuality = CompositingQuality.HighQuality;
        g.FillEllipse(brush, Centre.X - Radius, Centre.Y - Radius, 2 * Radius, 2 * Radius);
    }

    public void Move(Point NewCentre) => this.Centre = NewCentre;

    public void Dispose()
    {
        if (this.brush != null)
            this.brush.Dispose();
    }
}

Ваш Ball объект по-прежнему является значением свойства, но вы можете использовать вместо него список, чтобы одновременно можно было управлять несколькими объектами.

Form настройки:
(обратите внимание, что события Paint() и FormClosing() зарегистрированы в конструкторе Form, поэтому убедитесь, что они не зарегистрированы в другом месте, если они не используются по каким-либо другим причинам).

public Form1()
{
    InitializeComponent();
    ball = new Ball(new Point(250, 250));
    ball.State = 1;  // <- Will draw a green ball
    this.Paint += (s, e) => { ball.Draw(e.Graphics); };
    this.FormClosing += (s, e) => { ball.Dispose(); };
}

public Ball ball { get; set; }

Если вы хотите переместить объект Ball, установите новую позицию и вызовите this.Invalidate(), чтобы вызвать событие Form Paint():

ball.Colors.Add(Color.Orange);
ball.State = this.ball.Colors.Count - 1;  // <- Will draw an orange ball
ball.Radius = [new Radius];
ball.Move(new Point([X], [Y]));
this.Invalidate();
...