2016-11-08 32 views
0

私は現在this postの方法を使ってファイルのアイコンを取得しています。ファイルアイコンの64x64バージョンを入手できますか?

唯一の問題は、アイコンセットの16x16,32x32,48x48、および256x256バージョンしか取得できないことです。ジャンボバージョンを使用することは良いアイデアではありません。アイコンは拡大縮小後にひどく見えます。アイコンファイルには4つ以上のサイズがあるので、特定のサイズのアイコンを取得する方法があるはずです。しかしどうですか?

P.私は外部ライブラリを使用しないことを好みます。

+0

あなたはそれを取得することができなくなります。それが実際に存在していると確信していますか? – ChrisF

+0

これを見てください:https://www.creativefreedom.co.uk/icon-designers-blog/windows-7-icon-sizes/ - 64x64は必須ではないので、そこにはないかもしれません – PaulF

+0

'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

答えて

1

システムは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)); 
+0

私は[this](https://gist.github.com/TJYSunset/9f5c100a8b4b1ccf72bcf6d5a85f6d12)のようなコードを使用しましたが、無効なハンドルを渡したというArgumentExceptionがあります。 .lnkファイルのアイコンを取得するためにそのコードを使用しました。私は間違って何かしていますか? (申し訳ありませんが、私はそれを解決するのに役立つものは何も見つかりません。) –

関連する問題