图标和 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(( 会返回这样奇怪的结果有什么原因吗?我该怎么办?

图标和 DivideByZero 异常

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());

另外 - 为什么不更改列表框的结构以使用位图而不是图标,并摆脱此图标问题? :-(