Почему графика не рисует на панели? - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу нарисовать сетку на моей панели.Графический объект (экран), который я создал с помощью растрового изображения, не рисуется на моей панели.Я попытался с отладкой, чтобы посмотреть, если экран не рисовал, но это не так.

Я попытался создать графический объект из метода createGraphic на панели и параметр paintteventargs из метода рисования на панели.Оба раза, когда я использовал его для рисования с помощью OnPaint, это занимало слишком много времени.

    public Main()
    {
        InitializeComponent();
        backBuffer = new Bitmap(drawPanel.Width, drawPanel.Height);
        screen = Graphics.FromImage(backBuffer);
        sizeGridPoints = 2;
        lenghtBetweenGridPoints = 10;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        screen.Clear(Color.Black);
        DrawGrid();
    }

    private void DrawGrid()
    {
        for(int x = lenghtBetweenGridPoints; x < drawPanel.Width; x += lenghtBetweenGridPoints)
        {
            for(int y = lenghtBetweenGridPoints; y < drawPanel.Height; y+= lenghtBetweenGridPoints)
            {
                screen.FillEllipse(new SolidBrush(Color.Green), x, y, sizeGridPoints, sizeGridPoints);
            }
        }
    }

1 Ответ

0 голосов
/ 29 декабря 2018

Если вы создаете объект Graphics из растрового изображения, он будет рисоваться на этом растровом изображении, а не в вашем пользовательском интерфейсе.Вместо этого используйте объект Graphics из PaintEventArgs e вашего OnPaint метода, чтобы рисовать непосредственно на форме или элементе управления.

e.Graphics.FillEllipse(new SolidBrush(Color.Green), x, y, sizeGridPoints, sizeGridPoints);

Вы никогда не должны создавать свой собственный объект Graphics.

Создайте свой собственный элемент управления сеткой:

public class GridPanel : Panel
{
    public GridPanel()
    {
        DoubleBuffered = true; // Speeds up drawing, e.g. when panel is resized.

        // Set default colors
        BackColor = Color.Black;
        ForeColor = Color.Green;
    }

    private int _lenghtBetweenGridPoints = 20;
    public int LenghtBetweenGridPoints
    {
        get { return _lenghtBetweenGridPoints; }
        set {
            if (value != _lenghtBetweenGridPoints) {
                _lenghtBetweenGridPoints = value;
                Invalidate(); // Redraw the grid.
            }
        }
    }

    private int _sizeGridPoints = 3;
    public int SizeGridPoints
    {
        get {
            return _sizeGridPoints;
        }
        set {
            if (value != _sizeGridPoints) {
                _sizeGridPoints = value;
                Invalidate(); // Redraw the grid.
            }
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        // e.Graphics.Clear(Color.Black); Not necessary. We use the BackColor of the panel.
        if (LenghtBetweenGridPoints > 0 && SizeGridPoints > 0) {
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; // Optional.
            using (var brush = new SolidBrush(ForeColor)) { // We use the ForeColor of the panel.
                for (int x = LenghtBetweenGridPoints; x < Width; x += LenghtBetweenGridPoints) {
                    for (int y = LenghtBetweenGridPoints; y < Height; y += LenghtBetweenGridPoints) {
                        e.Graphics.FillEllipse(brush, x, y, SizeGridPoints, SizeGridPoints);
                    }
                }
            }
        }
    }
}

После того, как он будет скомпилирован, он автоматически появится в окне панели инструментов, и вы сможете перетащить его в форму.Вы даже сможете редактировать свойства LenghtBetweenGridPoints и SizeGridPoints в окне свойств.

Вы также можете просто использовать уже имеющиеся свойства BackColor и ForeColor панели для сетки.Это позволит вам также установить цвета в окне свойств.Не забудьте утилизировать созданные вами кисти.

...