我正在开发一个用户控件,它使用Visual Studio2008和System.Graphics在Windows CE设备上使用PictureBox绘制图形。
我在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次后也停止工作。
发布于 2014-07-21 15:12:08
实际上,像你这样主动绘制控件并不是一个好主意。尝试创建PictureBox的子类(或者,如果您不需要其他PictureBox功能,则从Panel甚至Control创建一个子类),并覆盖将由系统调用的绘制事件(如果需要绘制)。如果需要重画,请在控件上调用Invalidate。这样做的原因是您不必处理所有的Graphics创建,因为这将为您完成,而且您的绘图不会干扰控件的默认绘图。
另一种方法是绘制到Bitmap中,并将其设置为PictureBox图像(这可能比预期的要慢)。
发布于 2014-07-21 15:16:19
我认为每次都需要释放和释放对象,以避免出现这种问题。
像这样:
// Release handle to device context and dispose of the Graphics object
e.Graphics.ReleaseHdc(hdc);
newGraphics.Dispose();https://stackoverflow.com/questions/24859378
复制相似问题