Note: Question Using 256 x 256 Vista icon in application deals with using a "Vista" icon as the application's icon. This question deals with manually painting a Vista icon.
Note: Question WinForms .NET 2.0: How to paint the proper sized icon? deals with painting a Vista icon loaded from a file. This question deals with painting a Vista icon that is loaded from a .resource.
I've included an icon in my Visual Studio project that has various formats:
- 16×16
- 32×32
- 48×48
- 256×256 (PNG compressed)
Now want to draw the 256×256 version. None of the following things I've tried work.
The following draws the 32×32 format stretched to 256×256:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 256, 256));
The following draws the 32×32 format unstretched:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 256, 256));
The following draws the 32×32 format stretched to 256×256:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 256, 256));
The following draws the 48×48 format stretched to 256×256:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIcon(
new Icon(ico, new Size(256, 256)),
new Rectangle(0, 0, 256, 256));
How do I draw the 256×256 format icon?
Notes:
-
The icon is not coming from a file, so PInvoking LoadImage() will not help.
-
The icon is not the icon associated with a file, so PInvoking SHGetFileInfo() will not help. Nor will using Icon.ExtractAssociatedIcon.
-
I'm also not trying to author icons with a 256×256 format at runtime, so libraries designed to do that will not help.
2: Question WinForms .NET 2.0: How to paint the proper sized icon?
Best Answer
The
ResourceManager
loads the icon based on the bits stored in the resources. However, the way it handles loading won't let you access the 256x256 icon (this information does not make its way into theSystem.Drawing.Icon
that you are getting back).I am sorry to disappoint you, but the only way which works that I am aware of is to load the icon through a P/Invoke of
LoadImage
and working with a file (yes, I know, that's not what you were looking for). So the new question should be: how do I extract the bits of a given resource so that I can store them to a file? I fear that this isn't possible either, having done some stepping throughSystem.Resources.ResourceReader
, as the resource data seems to be a collection of serialized .NET objects.Anyway, for those who can afford to load the icon from a .ICO file (and for myself, as a future reference on how to load 256x256 icons), call
IconConverter.LoadIcon
:Once you have the
System.Drawing.Icon
in the expected size, just paint it usinggraphics.DrawIconUnstretched
.