使用Graphics对象绘图后重新使用数千次后停止工作

时间:2014-07-21 07:06:34

标签: c# graphics windows-ce hdc

我正在开发一个用户控件,该控件使用PictureBox在Windows CE设备上使用Visual Studio 2008和System.Graphics绘制图形。

我在PictureBox上绘制的初始代码是:

Graphics g = Graphics.FromHdc(picturebox1.CreateGraphics().GetHdc());

但是性能不好,所以我使用了全局变量Graphics g并将我的代码更改为:

g = g ?? Graphics.FromHdc(picturebox1.CreateGraphics().GetHdc());

然后我有一个奇怪的问题!我的代码中有一个计时器在PictureBox上绘制点,在使用Graphics约22,000次后,它停止绘制,尽管代码仍在运行。然后当我在上面编写的代码行上设置一个断点并使用QuickWatch强制更新图形对象时这样:

 g = Graphics.FromHdc(picturebox1.CreateGraphics().GetHdc());

它开始继续绘画并再次停止。我甚至更改了我的代码,因此它在22,000次之后创建了一个新对象,但是这个新对象在使用Graphics对象的另外22,000次之后也停止了工作。

2 个答案:

答案 0 :(得分:1)

与你一样积极吸引控制实际上并不是一个好主意。尝试创建PictureBox的子类(或者如果您不需要其他PictureBox功能,来自Panel或甚至Control的子类)并覆盖绘制事件如果需要绘图,系统将调用它。如果需要重绘,请在控件上调用Invalidate。这样做的原因是您不必处理所有Graphics创建,因为这将为您完成,并且您的绘图也不会干扰控件的默认绘制。< / p>

另一种方法是绘制成Bitmap并将其设置为PictureBox图像(可能比预期慢)。

答案 1 :(得分:0)

我认为你需要每次释放和处理对象以避免这个问题

喜欢:

 // Release handle to device context and dispose of the Graphics object
e.Graphics.ReleaseHdc(hdc);
newGraphics.Dispose();