public partial class Form1 : Form
{
readonly static Random rng = new Random();
readonly List<Point> pointList;
public Form1()
{
InitializeComponent();
pointList = new List<Point>();
this.Paint += Form1_Paint;
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
// Connect points with lines
if (pointList.Count >= 2)
{
e.Graphics.DrawLines(Pens.Red, pointList.ToArray());
}
// Add a small square at each point
foreach (var point in pointList)
{
e.Graphics.DrawRectangle(Pens.Black,
point.X - 2, point.Y - 2, 4, 4);
}
}
private void drawButton_Click(object sender, EventArgs e)
{
// Adds a random point on the list
pointList.Add(new Point(
rng.Next(this.ClientSize.Width),
rng.Next(this.ClientSize.Height)));
this.Invalidate();
}
}
2条答案
按热度按时间5us2dqdw1#
下面是一个在窗体单击时画图的最小示例:
如果线从黑色变为红色点击然后它的工作。
lg40wkob2#
你不能。
按钮单击事件无法启动绘制事件。通常,您可以使用
.Invalidate()
方法告诉系统下次需要重新绘制窗体。按钮单击必须更改“绘制内容”的效果,但不能更改“绘制时间”的效果。下面是一个如何在表单上绘图的示例。每次按下按钮,就会有一个随机点添加到点列表中。
然后,系统决定何时绘制窗体,在列表中添加新点后,您可以在可能的情况下强制重新绘制。
还有
.Refresh()
,它会立即强制重绘,但通常不需要。准确地说,你可以,但你不应该。下面的代码将触发和绘制事件,而不是调用
.Invalidate()
最终效果是相同的,只是现在您正在扰乱Windows任务调度和UI事件的处理。