於黾 2022-07-13 08:05 采纳率: 33.3%
浏览 30
已结题

程序使用了大量的Region导致报错:GDI+中发生一般性错误,如何解决?

问题遇到的现象和发生背景

做了大量的自定义控件,因为想要真正的透明效果,所以每个控件都会制定this.Region限制绘图区域

问题相关代码,请勿粘贴截图

using(GraphicsPath gp=new GraphicsPath(FillMode.Alternate))
{
//省略填充gp的代码
Region r=new Region(gp);
this.Region=r;
}

运行结果及报错内容

因为我有很多窗体,一开始不报错,当加载窗体多到一定程度就开始报错
this.Region=r;这一句代码报错
错误信息:GDI+中发生一般性错误,错误代码0x80004005,
通过代码获取到win32错误代码是0x591,不知道是什么东西溢出了
注意:不是内存泄漏
如果是内存泄漏,那么跟同时打开的窗体数量应该是无关的,而只跟内存占用有关
内存占用并不高
而且只要把窗体彻底关闭,那么即使反复打开也不会报错
但是只要同时打开的窗体数量多到一定程度(也就是使用region的控件的实例多到一定程度),就会崩溃

我的解答思路和尝试过的方法

1.在执行this.Region=r;之前,先执行this.Region.Dispose();但所有控件的透明效果都消失了
2.在执行this.Region=r;之后,执行r.Dispose();结果所有调用控件的窗口全报错了,感觉Region变成null了
3.在new r之前,判断r如果不为空,先执行r.Dispose(),但依然报错。

我想要达到的结果

是整个程序集内的Region有数量限制吗,能调大吗?
到底啥原因,咋解决?

  • 写回答

1条回答 默认 最新

  • xuzuning 2022-07-13 15:19
    关注

    gp.Dispose()

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月18日
  • 修改了问题 7月14日
  • 创建了问题 7月13日

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退