图标和 DivideByZero 异常
本文关键字:异常 DivideByZero 图标 | 更新日期: 2023-09-27 18:34:55
我有一个所有者绘制的列表框,其中包含表示项目的结构列表。 此结构有两个属性,一个图标和一个要显示的字符串。 它对于显示小图标,16x16 及左右工作得很好。 但是,我尝试调整此列表框以显示文件夹中的图片,并遇到了一些莫名其妙的错误。
public static System.Drawing.Icon BitmapToIcon (System.String String_Bitmap, System.Drawing.Icon Object_Default)
{
try
{
//return System.Drawing.Icon.FromHandle(((System.Drawing.Bitmap)(System.Drawing.Bitmap.FromFile(String_Bitmap))).GetHicon());
System.IO.Stream s = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(String_Bitmap));
System.Drawing.Bitmap b = ((System.Drawing.Bitmap)(System.Drawing.Bitmap.FromStream(s, true, true)));
System.Drawing.Icon i = System.Drawing.Icon.FromHandle(b.GetHicon());
s.Close();
b.Dispose();
return i;
}
catch
{
return Object_Default;
}
}
别处:
BitmapToIcon("D:/pictures/picture001.jpg", null);
该目录包含大约 400 张各种形状和格式的图像,但只有大约 60 张随机间隔的图像实际出现在列表框中。 在ListBox.DrawItem((中,Graphics.DrawIcon((抛出了一个DivideByZero函数。 在捕获异常时,它将图标注册为0x0。 很明显,我的函数是为了在发生错误时返回默认图标(在本例中为 null(。
我知道Windows ICO格式有256x256的限制,但据我所知,这不是这里发生的事情。 它确实绘制的一些图像实际上要大得多,而且它们也不是方形的。 此外,它不会在 400 个列表中加载的所有图像在 10 个列表中加载得很好。 我想也许GDI有太多句柄或其他东西,所以我更改了函数以释放我的源位图并添加了一个睡眠语句,但都没有帮助。 将列表框更改为使用位图而不是图标修复了绘图问题,但现在它会消耗更多内存。
GetHIcon(( 会返回这样奇怪的结果有什么原因吗?我该怎么办?
Ryan,Eric 的意思是最好使用指令来避免以下代码:
System.Drawing.Bitmap b = ((System.Drawing.Bitmap)(System.Drawing.Bitmap.FromStream(s, true, true)));
重构后,它看起来像:
using System.Drawing.Bitmap;
Bitmap b = ((Bitmap)(Bitmap.FromStream(s, true, true)));
很难阅读您提供的代码。尝试使用 Image.FromFile(( 函数加载图像或使用带有路径参数的位图构造函数。
Bitmap b = new Bitmap(String_Bitmap);
Icon i = Icon.FromHandle(b.GetHicon());
catch 子句中捕获错误,以查看导致返回默认图标的异常类型。
如果您从不调用 DestroyIcon 并重复调用此方法,则很可能是您用完了 GDI 资源。
我还可以建议这段代码等效于您的代码,并且更容易阅读:
using ( var b = (Bitmap)Image.FromFile(String_Bitmap))
return Icon.FromHandle(b.GetHicon());
另外 - 为什么不更改列表框的结构以使用位图而不是图标,并摆脱此图标问题? :-(