C#:将.ico文件与多个图像一起使用

C#:将.ico文件与多个图像一起使用,c#,.net,icons,C#,.net,Icons,我试图从一个包含两个图标的.ico文件(32x32版本和16x16版本)在C#中的树视图中设置图像。图像正在设置中,但是.Net选择了32x32版本,并将其缩小(看起来很糟糕),而不是选择现成的16x16图像 有关守则: ilTree.Images.Add(Properties.Resources.group); ilTree.Images.Add(Properties.Resources.single); ilTree.Images.Add(Properties.Resources.db);

我试图从一个包含两个图标的.ico文件(32x32版本和16x16版本)在C#中的树视图中设置图像。图像正在设置中,但是.Net选择了32x32版本,并将其缩小(看起来很糟糕),而不是选择现成的16x16图像

有关守则:

ilTree.Images.Add(Properties.Resources.group);
ilTree.Images.Add(Properties.Resources.single);
ilTree.Images.Add(Properties.Resources.db);
treeStored.ImageList = ilTree;
我哪里做错了


回答:

有两件事你必须做才能让它工作。第一,如下所述,是手动指定图像列表的正确大小。第二,您可能还必须指定颜色深度。MSDN声明:

在.NET Framework 1.1版或更高版本中,默认值为Depth8Bit


…然而,这并没有阻止ImageList从我的8位图标中删除颜色。经过仔细检查,我的图标(有三个)是:4位、4位、8位。两个4位图标共享调色板,但8bit有一个不同的调色板。图标之间总共有257种颜色。尽管只有轻微的溢出,.Net将其减少到仅20种颜色。

将ImageList的ImageSize属性设置为新的大小(16,16)

您需要创建一个新的图标对象。接受原始图标对象和大小的构造函数有一个重载。我不知道新图标对象是否会共享相同的HIcon,但它会正确绘制。为了安全起见,我建议确保两者都已处理。

这是ImageList的默认大小-手动设置它将(并且在我添加它时)无效。嗯,这以前对我很有效。您是在添加图像之前还是之后设置的?没有意识到这是违约。好吧,它起作用了。尽管如果TreeView能做正确的事情肯定会更好™...事实上,不完全是这样。此--ilTree.ColorDepth=ColorDepth.depth24位;--这也是需要的。否则,它似乎假定(错误地)为16位。默认值为8位,但它应该加载您以前指定的颜色深度的图像。