美好的一天,每个人都有这个代码来创建一个简单的圆圈
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);
}
问题是当我运行它时,我呈现这种不完整的输出
你能告诉我为什么会这样吗?谢谢
答案 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);
}