我正试图在同一个面板中绘制一些椭圆,协调员由鼠标单击确定。这是我的代码,这个代码只能画一个圆。较新的圆总是更新面板上较旧的圆。所以总是只有一个圆圈。
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
x = e.X;
y = e.Y;
panel1.Invalidate();
}
Graphics g;
private void panel1_Paint(object sender, PaintEventArgs e)
{
g = panel1.CreateGraphics();
g.FillEllipse(Brushes.Red, x,y, 10, 10);
}
Winforms图形基本规则#1:永远不要使用control.CreateGraphics
!永远不要尝试缓存Graphics
对象!使用Graphics g = Graphics.FromImage(bmp)
绘制到Bitmap bmp
中,或者在控件的Paint
事件中使用e.Graphics
参数。。
您可以通过执行最小化/最大化序列来测试图形的持久性。。
正确的方法是保留一个要绘制的事物列表,每当该列表更改Invalidate
时,您就可以绘制控件。所有绘制都应该在Paint
事件中,在那里使用e.Graphics
!
这将让你画许多圆圈:
List<Point> points = new List<Point>(); // List<T> is wonderful !
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
points.Add(e.Location);
panel1.Invalidate();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
g = e.Graphics; // only ever use this one for persistent graphics!!
foreach( Point pt in points)
g.FillEllipse(Brushes.Red, pt.X, pt.Y, 10, 10);
}
通过将其全部删除
points.Clear();
通过删除最后一个
points.Remove(points.Last());
对于其他尺寸,请存储List<Rectangle>
。对于更复杂的绘图,创建一个自己的DrawAction
类来容纳笔、颜色甚至旋转和其他形状等。