图形如何不绘制到面板上

时间:2018-12-29 15:17:08

标签: c# graphics panel

我想在面板中绘制一个网格。我使用位图创建的图形对象(屏幕)在面板中未绘制。我尝试调试以查看屏幕是否未绘制,但事实并非如此。

我尝试从面板createGraphic方法创建图形对象,并从面板绘画方法创建参数painteventargs。两次当我用它与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 :(得分:0)

如果从位图创建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);
                    }
                }
            }
        }
    }
}

一旦它被编译,它将自动出现在工具箱窗口中,您可以将其拖放到表单上。您甚至还可以在属性窗口中编辑属性LenghtBetweenGridPointsSizeGridPoints

您还可以简单地使用网格面板的已经可用的BackColorForeColor属性。这也允许您在属性窗口中设置颜色。不要忘记处理您创建的画笔。

相关问题