システムは4つの異なるサイズの画像リストを管理します。小(16x16)、大(32x32)、超大(48x48)、ジャンボ(256x256)です。
しかし、サイズは標準的なものだけであることに注意してください。システムが異なるDPIスケーリングファクタに設定されている場合、サイズは変更可能です(たとえば、200%DPIシステムでは、大きな画像リストは64x64になります)。
システムがシステムイメージリストにアイコンを追加すると、アイコンリソースから最も近いサイズが選択され、スケーリングができるだけ避けられます。つまり、プログラムに64x64ピクセルのアイコンが含まれている場合は、余分な大きな画像に使用される可能性があります。大きな画像に使用される可能性があります。小さな画像(400%DPIスケーリングされたシステム) - 保証はありません。
特定のサイズのアイコンを実行可能ファイルから確実に抽出する唯一の方法は、自分でロードすることです。
アイコン(またはアイコンインデックス)を取得する代わりにSHGetFileInfo
を使用する代わりに、アイコンリソースの存在場所(つまり、アイコンリソースとリソースインデックスを含む実行可能ファイル)を教えてください。これを行うには、SHGFI_ICONLOCATION
フラグを使用します。これにより、アイコンを含む実行可能パスがszDisplayName
に、アイコンのインデックスはiIcon
に戻ります。
パラメータを使用して、その情報をSHDefExtractIcon
関数に渡して、特定のサイズのアイコンを要求することができます。
擬コードは:64×64のアイコンが存在しない場合は
// find icon location for .txt file icons
SHFILEINFO sfi{};
SHGetFileInfo(L".txt", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_USEFILEATTRIBUTES | SHGFI_ICONLOCATION);
// extract the 64x64 pixel icon
HICON hIcon;
SHDefExtractIcon(sfi.szDisplayName, sfi.iIcon, 0, nullptr, &hIcon, MAKELONG(0, 64));
あなたはそれを取得することができなくなります。それが実際に存在していると確信していますか? – ChrisF
これを見てください:https://www.creativefreedom.co.uk/icon-designers-blog/windows-7-icon-sizes/ - 64x64は必須ではないので、そこにはないかもしれません – PaulF
'SHGetImageList'を使用している場合は、 [docs](https://msdn.microsoft.com/en-us/library/windows/desktop/bb762185(v = vs.85).aspx)は、あなたが 'SHIL_SYSSMALL'と*を使う必要があると言っていますSM_CYSMICONで呼び出されるSM_CXSMICONおよびGetSystemMetricsで呼び出されたGetSystemMetricsで指定されたサイズ* – DavidG