我有一个包含大小为16x16,24x24和32x32的32位图像的图标。我创建了三个包含三个不同大小图像的ImageList对象,并根据用户选择的大小在ToolStrip上分配ImageList属性。但是,ToolStrip对象上显示的图像是32x32图像的缩放版本。我无法弄清楚为什么当我创建16x16 ImageList时,它不会从图标中提取16x16图像。我的代码基本上是这样的:
ImageList m_imageList16 = new ImageList();
m_imageList16.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
m_imageList16.ImageSize = new System.Drawing.Size(16, 16);
m_imageList16.TransparentColor = System.Drawing.Color.Transparent;
// Open is an icon in my resources that contains various sizes of images.
m_imageList16 .Images.Add(global::MyTestApp.Properties.Resources.Open);
// Later when the user selects the 16 size from a menu, I change the toolbar:
m_toolbar.ImageScalingSize = new Size(16, 16);
m_toolbar.ImageList = m_imageList16;
这似乎只是在我的图标中采用32x32尺寸的图像并将其缩小到16x16,而不是使用图标中定义的16x16图像。有人能帮忙吗?提前感谢任何输入!
答案 0 :(得分:1)
我找不到任何证据来支持我的理论,但ImageList似乎并不知道选择不同大小的图标。我的预感是它只是将图标转换为位图并存储该数据。
在MSDN forums,我从MVP用户nobugz找到了这个片段:
我想我可以重现你的问题。当我使用MicroAngelo(图标编辑器实用程序)从shell32.dll中提取图标#5时,将其保存到磁盘,然后将图标添加到16x16 ImageList,我看到图标的内插版本很差。当我编辑图标并删除除16x16x256颜色以外的所有格式时,我会得到一个漂亮的图标清晰版本。
看起来 ImageList不够智能,无法选择与ImageList的ImageSize 和ColorDepth属性最匹配的图标。它从来都不是一个特别聪明的控制。这与您的情景不太匹配,但结果是一样的。看到32x32的PhysicalDimension提示您在解压缩图标时出现问题。我在编辑过的图标上看到16x16,在未编辑的图标上看到32x32。
此外,this page from CSharpKey似乎是使用ImageLists和图标的有用资源。这是一段摘录:
如果要创建图标列表,可以使用默认大小16x16创建每个图标。在某些情况下(例如如果您打算将图像用于列表视图),您可以创建或设计第二组图标,其大小为32x32(和/或48x48)每个。
似乎是“在行之间读取”,ImageList只存储一个大小并返回存储的图像的重采样版本。
修改强>
我在CodeProject(Embedding Icons in your VB.NET application)找到了另一个参考文献:
嗯,这似乎是一个非常好的解决方案,直到我意识到一个ImageList只将图像存储为单个分辨率的位图。因此,如果我想要在整个应用程序中使用各种大小的所有这些大图标,可能使用它们的不同大小(因为图标在其单个文件中存储了多个大小),ImageList并不会完全削减它。 / p>
答案 1 :(得分:0)
我在2006年提交了这个错误,微软的bug们回答说他们可以重现这个问题,但这不是一个关键问题,他们不打算解决它。
我现在使用适当的png而不是multisize图标。