IDE:Microsoft Visual Studio 2010 平台:C#.Net
我试图在C#中的一个表单中的函数内调用paint事件。该函数当前有两个整数参数,但我希望在该函数中调用面板的paint事件,但是在调用paint事件时我收到错误。有什么建议吗?
答案 0 :(得分:3)
您应该将坐标保存到字段或列表中,这对您的案例更有意义。
然后使面板无效,这将提升绘制事件,然后您可以从保存的坐标中绘制线条。
这是获得你最想要的东西而没有太多麻烦的唯一方法,因为以非标准方式绘制到窗口(面板)并不是一件容易的事。
[编辑]另外: 不要忘记每次引发Paint事件时都必须重绘该Panel上的整个“场景”,即使你使用Bitmap(backbuffer)作为备份,你需要再次将这个Bitmap blit到Panel上。 p>
[编辑]样本:
private readonly Stack<Point> _points = new Stack<Point>();
private readonly Pen _blackPen = new Pen(Color.Black);
private void Form1_Paint(object sender, PaintEventArgs e)
{
var points = _points.ToArray();
for (int i = 1; i < points.Length; i++)
{
e.Graphics.DrawLine(_blackPen, points[i - 1], points[i]);
}
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
_points.Push(e.Location);
Invalidate();
}
答案 1 :(得分:2)
让Paint事件处理程序运行只需要告诉Winforms需要重新绘制面板:
panel1.Invalidate();
您还可以使用Refresh(),它立即调用Paint事件,而不是让Windows排序生成事件的最佳时间。这是什么时候没有什么需要做的紧迫,如响应用户输入或调度发送而不是发布的消息。不是你应该考虑的东西,虽然它是不使用线程的创可贴。
答案 2 :(得分:-1)
以前的答案都没有对我有用。经过一段时间的调查,我设法按照以下说明进行绘画活动:
this.InvokePaint(this, new PaintEventArgs(this.CreateGraphics(), this.DisplayRectangle));