【发布时间】:2017-11-12 00:36:45
【问题描述】:
所以我意识到这样做:
panel1.CreateGraphics()
被严重看不起,但我正在制作一个绘画应用程序,我看不到任何其他方式,只是因为如果我调用 panel1.Invalidate(); 它显然不会保存用户绘制的线条。
所以这是我的代码:
private void pnlPaintPanel_MouseDown(object sender, MouseEventArgs e)
{
shouldPaint = true;
prePoint = new Point(e.X, e.Y);
}
private void pnlPaintPanel_MouseUp(object sender, MouseEventArgs e)
{
shouldPaint = false;
}
private void pnlPaintPanel_MouseMove(object sender, MouseEventArgs e)
{
curPoint = new Point(e.X, e.Y);
if (shouldPaint)
{
pnlPaintPanel.Invalidate();
}
prePoint = new Point(e.X, e.Y);
}
private void pnlPaintPanel_Paint(object sender, PaintEventArgs e)
{
using (Pen p = new Pen(chosenColor, penSize))
{
p.StartCap = LineCap.Round;
p.EndCap = LineCap.Round;
e.Graphics.DrawLine(p, prePoint, curPoint);
}
}
这显然不起作用,因为它只会立即清除用户放下的任何油漆。我敢肯定有一个聪明的方法。谁能帮忙?
【问题讨论】:
-
Here is an example - 诀窍是拥有一个绘制所需数据的 List
。从 List - > 开始!听起来很复杂?不是当你想到它:你想要几条(list1)曲线(list2)..
-
所以我尝试了这个,你是对的,它有效,(实际上我已经阅读了你关于它的精彩帖子,非常丰富的知识学到了很多)。我唯一的问题是,由于面板无效,它不断闪烁白色(因为它正在重新绘制),使用较大的笔,线条在转折点处出现故障,并且当笔大小发生变化时,所有线条都会改变大小。闪烁的面板是主要问题,知道有什么方法可以解决这个问题吗?
-
您需要通过反射或创建子类对面板进行双缓冲。在这种情况下,我建议使用一个子类,因为它允许您向它添加更多行为。Here is an example -
class DrawPanel : Panel { public DrawPanel() { DoubleBuffered = true; } }) -
对于线条中的故障,请为这些 Pen 属性设置合适的值:LineJoin、MiterXyz、End/StartCaps!对于斜接使用 ca。笔宽的 1/2。我通常更喜欢圆形帽和连接..