0

大家好,我有这个代码来创建一个简单的圆圈

 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);

        }

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

在此处输入图像描述

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

4

3 回答 3

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);
于 2013-10-06T12:28:25.530 回答
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 派生您自己的类是必要的。

于 2013-10-06T12:50:37.683 回答
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);
    }
于 2013-10-06T12:36:07.287 回答