我有一个定期绘制的用户控件,以及另一个类中的计时器,当它打勾时,我希望在用户控件上绘制一个字符串。
以下是我使用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
,我会遇到某种死锁问题,字符串永远不会改变。
那么在这个实例中对控件进行线程安全绘制的最佳方法是什么?任何帮助将不胜感激。