我正在开发一个用户控件,该控件使用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次之后也停止了工作。
答案 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();