根据this question的说明,我运行了一些代码来从文件中提取图标并将其显示在ListView设置为详细信息模式中。我希望图标显示为16 x 16,但是当我将ImageList大小设置为时,出现的图标看起来非常奇怪(不确定如何描述它 - 请参阅附带的屏幕截图)。
我已经尝试将尺寸更改为32 x 32并且它们很好,但是肯定必须有一种方法可以获得高质量的16 x 16图标一定不存在吗?
http://img165.imageshack.us/img165/4446/badqualityiconscc4.png
答案 0 :(得分:10)
你必须使用2个图像列表,一个用于小图像,一个用于大图像,以获得我认为的最佳结果。 (listview有两个属性,LargeImageList和SmallImageList)
编辑(找到我尝试时有用的新信息):
这个版本使用插值来获得较小的拇指,应该更好。
Dim BigIcon As Icon = Nothing
BigIcon = Icon.ExtractAssociatedIcon("c:\zebra.zip")
Dim largeimages As New ImageList
Dim smallimages As New ImageList
largeimages.Images.Add("1", BigIcon)
'Fix a smaller version with interpolation
Dim bm As New Bitmap(BigIcon.ToBitmap)
Dim thumb As New Bitmap(16, 16)
Dim g As Graphics = Graphics.FromImage(thumb)
g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.DrawImage(bm, New Rectangle(0, 0, 16, 16), New Rectangle(0, 0, bm.Width, bm.Height), GraphicsUnit.Pixel)
g.Dispose()
bm.Dispose()
smallimages.Images.Add("1", thumb)
ListView1.SmallImageList = smallimages
ListView1.LargeImageList = largeimages
thumb.Dispose()
ListView1.Items.Add("Test", "Test", "1")
答案 1 :(得分:4)
使用此Code Project Article和Demo of ExtractIconEx on PInvoke.net,您可以编写以下内容:
FileAssociationInfo info = new FileAssociationInfo(".docx");
ProgramAssociationInfo pai = new ProgramAssociationInfo(info.ProgID);
ProgramIcon ico = pai.DefaultIcon;
Icon icoLarge = Martin.Hyldahl.Examples.ExtractIconEx.ExtractIconExample.ExtractIconFromExe(ico.Path, ico.Index, false);
您必须将ExtractIconFromExe的签名更改为
public static Icon ExtractIconFromExe(string file, int nIconIndex, bool large)
并将代码更改为
几行if (large)
readIconCount = ExtractIconEx(file, nIconIndex, hIconEx, hDummy, 1);
else
readIconCount = ExtractIconEx(file, nIconIndex, hDummy, hIconEx, 1);
答案 2 :(得分:0)
通过defaut Imagelist将ColorDepth属性设置为Depth8Bit,将其设置为Depth32Bit 。