我是C#新手,正在尝试弄清楚如何使用按钮单击事件绘制窗体。我知道绘制事件处理程序所需的参数是PaintEventArgs,而按钮单击事件处理程序传递EventArgs如何通过单击按钮来绘制窗体?这一切都是在Visual Studio 2022中完成的
PaintEventArgs
EventArgs
5us2dqdw1#
下面是一个在窗体单击时画图的最小示例:
void Main(){ var form1 = new Form1(); form1.Show();}public class Form1 : Form{ public Form1() { var colour = System.Drawing.Color.Black; this.Click += (s, e) => { colour = System.Drawing.Color.Red; this.Invalidate(); }; this.Paint += (s, e) => { using var pen = new System.Drawing.Pen(colour); e.Graphics.DrawLine(pen, 0, 0, 10, 20); }; }}
void Main()
{
var form1 = new Form1();
form1.Show();
}
public class Form1 : Form
public Form1()
var colour = System.Drawing.Color.Black;
this.Click += (s, e) =>
colour = System.Drawing.Color.Red;
this.Invalidate();
};
this.Paint += (s, e) =>
using var pen = new System.Drawing.Pen(colour);
e.Graphics.DrawLine(pen, 0, 0, 10, 20);
如果线从黑色变为红色点击然后它的工作。
lg40wkob2#
你不能。按钮单击事件无法启动绘制事件。通常,您可以使用.Invalidate()方法告诉系统下次需要重新绘制窗体。按钮单击必须更改“绘制内容”的效果,但不能更改“绘制时间”的效果。下面是一个如何在表单上绘图的示例。每次按下按钮,就会有一个随机点添加到点列表中。
.Invalidate()
然后,系统决定何时绘制窗体,在列表中添加新点后,您可以在可能的情况下强制重新绘制。
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(); } }
public partial class Form1 : Form
readonly static Random rng = new Random();
readonly List<Point> pointList;
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)));
还有.Refresh(),它会立即强制重绘,但通常不需要。准确地说,你可以,但你不应该。下面的代码将触发和绘制事件,而不是调用.Invalidate()
.Refresh()
Graphics g = this.CreateGraphics(); OnPaint(new PaintEventArgs(g, ClientRectangle));
Graphics g = this.CreateGraphics();
OnPaint(new PaintEventArgs(g, ClientRectangle));
最终效果是相同的,只是现在您正在扰乱Windows任务调度和UI事件的处理。
2条答案
按热度按时间5us2dqdw1#
下面是一个在窗体单击时画图的最小示例:
如果线从黑色变为红色点击然后它的工作。
lg40wkob2#
你不能。
按钮单击事件无法启动绘制事件。通常,您可以使用
.Invalidate()
方法告诉系统下次需要重新绘制窗体。按钮单击必须更改“绘制内容”的效果,但不能更改“绘制时间”的效果。下面是一个如何在表单上绘图的示例。每次按下按钮,就会有一个随机点添加到点列表中。
然后,系统决定何时绘制窗体,在列表中添加新点后,您可以在可能的情况下强制重新绘制。
还有
.Refresh()
,它会立即强制重绘,但通常不需要。准确地说,你可以,但你不应该。下面的代码将触发和绘制事件,而不是调用
.Invalidate()
最终效果是相同的,只是现在您正在扰乱Windows任务调度和UI事件的处理。