问题遇到的现象和发生背景
做了大量的自定义控件,因为想要真正的透明效果,所以每个控件都会制定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有数量限制吗,能调大吗?
到底啥原因,咋解决?