首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Graphics对象绘制在重复使用几千次后停止工作

使用Graphics对象绘制在重复使用几千次后停止工作
EN

Stack Overflow用户
提问于 2014-07-21 15:06:34
回答 2查看 452关注 0票数 0

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

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

代码语言:javascript
复制
Graphics g = Graphics.FromHdc(picturebox1.CreateGraphics().GetHdc());

但它的性能很差,所以我使用了一个全局变量Graphics g,并将我的代码更改为:

代码语言:javascript
复制
g = g ?? Graphics.FromHdc(picturebox1.CreateGraphics().GetHdc());

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

代码语言:javascript
复制
 g = Graphics.FromHdc(picturebox1.CreateGraphics().GetHdc());

它开始继续绘制,并且不会再次停止。我甚至更改了我的代码,使其在22,000次后创建一个新对象,但这个新对象在再次使用Graphics对象22,000次后也停止工作。

EN

回答 2

Stack Overflow用户

发布于 2014-07-21 15:12:08

实际上,像你这样主动绘制控件并不是一个好主意。尝试创建PictureBox的子类(或者,如果您不需要其他PictureBox功能,则从Panel甚至Control创建一个子类),并覆盖将由系统调用的绘制事件(如果需要绘制)。如果需要重画,请在控件上调用Invalidate。这样做的原因是您不必处理所有的Graphics创建,因为这将为您完成,而且您的绘图不会干扰控件的默认绘图。

另一种方法是绘制到Bitmap中,并将其设置为PictureBox图像(这可能比预期的要慢)。

票数 1
EN

Stack Overflow用户

发布于 2014-07-21 15:16:19

我认为每次都需要释放和释放对象,以避免出现这种问题。

像这样:

代码语言:javascript
复制
 // Release handle to device context and dispose of the Graphics object
e.Graphics.ReleaseHdc(hdc);
newGraphics.Dispose();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24859378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档