Following the directions at this question, I have some code running to extract icons from files and display them in a ListView set to details mode. I want to icons to display at 16 x 16, but when I have the ImageList size set to that the icons that come out look very weird (not sure how to describe it - see attached screenshot).
I've tried changing the size to 32 x 32 and they come out fine, but surely there must be a way to get good quality 16 x 16 icons mustn't there?
http://img165.imageshack.us/img165/4446/badqualityiconscc4.png
You have to use 2 imagelists, one for smallimages and one for largeimages to get the best result I think. (The listview has two properties, LargeImageList and SmallImageList)
Edit (found new information that worked when I tried):
This version are using interpolation to get the smaller thumb, should be better.
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")
With this Code Project Article and the Demo of ExtractIconEx on PInvoke.net you can write the following:
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);
you have to change the signature of ExtractIconFromExe to
public static Icon ExtractIconFromExe(string file, int nIconIndex, bool large)
and change the code a few lines down to
if (large)
readIconCount = ExtractIconEx(file, nIconIndex, hIconEx, hDummy, 1);
else
readIconCount = ExtractIconEx(file, nIconIndex, hDummy, hIconEx, 1);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With