在函数内调用paint事件

时间:2014-02-19 09:59:55

标签: c# .net winforms visual-studio-2010 c#-4.0

IDE:Microsoft Visual Studio 2010 平台:C#.Net

我试图在C#中的一个表单中的函数内调用paint事件。该函数当前有两个整数参数,但我希望在该函数中调用面板的paint事件,但是在调用paint事件时我收到错误。有什么建议吗?

3 个答案:

答案 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));