Date: | October 5, 2012 / year-entry #236 |
Tags: | code |
Orig Link: | https://blogs.msdn.microsoft.com/oldnewthing/20121005-00/?p=6393 |
Comments: | 13 |
Summary: | The usual way of loading an icon from a resource is to use the LoadIcon or LoadImage function and letting the window manager's icon selection algorithm decide which image to use based on the images available in the icon, the desired icon size, and the current color depth. A customer wanted to override that algorithm,... |
The usual way of loading an icon from a resource is to use the
You basically do the same thing the window manager does. As we saw earlier, icon resources are actually stored in multiple pieces. The thing you use to talk about icons is actually the icon directory, which in turn points to a set of images. The first step, then, is to obtain the icon directory. HRSRC hrsrcIcon = FindResource(hResources, MAKEINTRESOURCE(IDI_MY_ICON), RT_GROUP_ICON); HGLOBAL hIcon = LoadResource(hResources, hrsrcIcon); auto lpIcon = static_cast<GRPICONDIR *>(LockResource(hIcon));
You then take the images listed in the
When you've found the image you like, take the HRSRC hrsrcImage = FindResource(hResources, MAKEINTRESOURCE(nId), RT_ICON); HGLOBAL hImage = LoadResource(hResources, hrsrcImage); auto lpImage = static_cast<PBYTE>(LockResource(hImage));
You can then convert the icon image data into an icon by
using the
|
Comments (13)
Comments are closed. |
"If you want to use the default algorithm, you can call LookupÂIconÂIdÂFromÂDirectory or LookupÂIconÂIdÂFromÂDirectoryÂEx. But if you want to use the default algorithm, then just use LoadÂImage already!"
This seems to be erroneous. Both methods use the default algorithm?
The Ex version lets you specify a desired size. But both use the default algorithm for color depth selection.
@Andrew: he's saying don't waste time if you want the default behavior of the current color depth – just use LoadImage. But if you need to do something different, then carry on…
In other words, if your custom algorithm == default algorithm, just use LoadImage.
LoadIcon should have loaded all icons, and DrawIcon/DrawIconEx should have decided which resolution to use. The current architectural choices makes me cringe!
Just a reminder that LoadIcon and co are from time, where RAM saving had high prioirty.
Sadly it seems that the LoadIcon algorithm is broken since Vista. On a 150% scale DPI setting it loads always the lower resolution and never the higher. Because of that almost all application icons look blurry on the taskbar if you disable "Always combine" for the taskbar. Only some MS applications dont seem to do that, but only because they provide icons in all kinds of sizes.
If a 0.25mb ico file is compiled into the binary, there's of course no surprise that it will use 0.25 of ram when loading it.
@640K: If you always load *all* versions of an icon, there's of course no surprise that it uses lots more ram than if you only load what was actually needed.
[It's a surprise if you aren't the one who compiled the binary. LoadImage("Notepad.exe", 16, 16)…]
LoadIcon isn't LoadImage. If you don't specify a size (i.e. LoadIcon), then it's a surprise that the whole icon, including all it's resolutions, isn't loaded.
Shouldn't pointers to resource data be decorated with const and __unaligned?
blogs.msdn.com/…/10007461.aspx
Loadicon also sounds like a Transformer.
@Clipboarder Gadget: Maybe the offending apps/icons are not DPI-aware? If the app hasn't declared itself DPI-aware in the manifest, Windows Vista/7 will emulate 96 DPI which might explain your behavior.
No the programs are DPI-aware.
Even if you take a simple program from Petzolds samples with an icon and make it DPI-aware, Windows will take the 16-sized icon and scale it up even though there is a 32-sized icon.
You can prevent this by calling LoadIconWithScaleDown or ExtractIconEx instead of LoadIcon but most programs don't seem to do that.