从Timer的线程绘制(使用双缓冲图形)

时间:2015-08-10 18:30:41

标签: c# multithreading forms graphics drawing

我有一个定期绘制的用户控件,以及另一个类中的计时器,当它打勾时,我希望在用户控件上绘制一个字符串。

以下是我使用Double Buffered graphics绘制表单的方式:

Private BufferedGraphicsContext Context:
Private BufferedGraphics BufferGraphics:

//...Later in UserControl_Load
    this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
    this.Context = BufferedGraphicsManager.Current;
    this.Context.MaximumBuffer = new Size(this.Width + 1, this.Height + 1);
    this.BufferGraphics = this.Context.Allocate(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height));


    //...Drawing to the form like you would regular Graphics
    this.BufferGraphics.Graphics.DrawEllipse(....

//paint event
protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    this.BufferGraphics.Render(e.Graphics);
}


    //to trigger a paint event, I call this
    this.BufferGraphics.Render(Graphics.FromHwnd(this.Handle));

我尝试添加调用Timer_Tick事件中的方法,但每当我使用this.BufferGraphics.Graphics时,我都会收到空指针异常,因为this.BufferGraphics为空。

我还发现如果我全局保存字符串然后尝试在graphics.DrawString事件中使用OnPaint,我会遇到某种死锁问题,字符串永远不会改变。

那么在这个实例中对控件进行线程安全绘制的最佳方法是什么?任何帮助将不胜感激。

0 个答案:

没有答案