在面板绘制中绘制渲染不完整的对象

时间:2013-10-06 12:19:00

标签: c# winforms

美好的一天,每个人都有这个代码来创建一个简单的圆圈

 private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g;
            Pen myPen = new Pen(Color.Black, 1);
            Point sp = new Point(5, 5);//starting point sp
            Point ep = new Point(100, 100);//ending point ep
            g = this.CreateGraphics();//tells compiler that we are going to draw on this very form
            g.DrawLine(myPen, sp, ep);

            g = this.CreateGraphics();
            g.DrawEllipse(myPen, 0, 0, 90, 90);

        }

问题是当我运行它时,我呈现这种不完整的输出

enter image description here

你能告诉我为什么会这样吗?谢谢

3 个答案:

答案 0 :(得分:4)

g = this.CreateGraphics();//tells compiler that we are going to draw on this very form

您正在表单上绘制,而不是在面板中绘制。要么将它画在隐藏面板的面板中。

g = this.pnlName.CreateGraphics();

要绘制内部面板,请参阅Hans Passant的答案。由于这是一个可以接受的答案,我也在这里添加代码

 e.Graphics.DrawEllipse(myPen, 0, 0, 90, 90);

答案 1 :(得分:4)

   g = this.CreateGraphics();

永远不要使用CreateGraphics(),它只适用于基于游戏风格的框架绘图。当你创建一个每个帧都不同的游戏时你所做的那种。您通过使用 this 来复杂化问题,这将创建一个呈现给表单表面而不是面板的Graphics对象。这是由表单上的控件剪切,在您的情况下面板。

Paint事件已经为您提供了一个准备绘制到控制界面的Graphics对象。或者从将DoubleBuffered属性设置为true得到的双缓冲缓冲区,这是您下一个可能的问题。您还应该处理您使用的绘图对象。修正:

    private void panel1_Paint(object sender, PaintEventArgs e) {
        using (var myPen = new Pen(Color.Black, 1)) {
            e.Graphics.DrawLine(myPen, new Point(5, 5), new Point(100, 100));
            e.Graphics.DrawEllipse(myPen, 0, 0, 90, 90);
        }
    }

禁止Panel类使用的优化也很重要。作为容器控件,它限制了它重新调整大小时重新调整到仅显示的控件部分。当您绘制的内容也取决于面板的大小时,这会产生令人不快的涂抹效果。通过在构造函数中将ResizeRedraw属性设置为true来抑制此优化,从Panel派生自己的类是必要的。

答案 2 :(得分:2)

您可以删除面板并使用您的代码或在面板上绘制它。

private void panel1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g;
        Pen myPen = new Pen(Color.Black, 1);
        Point sp = new Point(5, 5);//starting point sp
        Point ep = new Point(100, 100);//ending point ep
        //Paint it on panel
        g = panel1.CreateGraphics();//tells compiler that we are going to draw on this very form
        g.DrawLine(myPen, sp, ep);

        //Paint it on panel
        g = panel1.CreateGraphics();
        g.DrawEllipse(myPen, 0, 0, 90, 90);
    }