SHGetImageList returns Windows 7 上损坏的文件夹图标
SHGetImageList returns corrupted folder icon on Windows 7
Windows7.
上文件夹的默认图标有问题
我习惯用下一个代码获取图标
DWORD flags = directory ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL;
...
HICON largeIcon = NULL;
SHGetFileInfo(filename.c_str(), flags, &shfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX);
IImageList* imageList = NULL;
HRESULT hResult = SHGetImageList(SHIL_JUMBO, IID_IImageList, (void**)&imageList);
if (!imageList || hResult != S_OK)
return NULL;
hResult = imageList->GetIcon(shfi.iIcon, ILD_TRANSPARENT, &largeIcon);
if (hResult != S_OK)
return NULL;
icon = LoadBitmapFromHicon(largeIcon);
DestroyIcon(shfi.hIcon);
DestroyIcon(largeIcon);
但是它 returns 损坏了文件夹的图标。其他的还好。
我在上面应用了灰色滤镜。原来的一个样子。
http://i.stack.imgur.com/IM7pm.png
PS。我在 W8 上看起来不错。
有同样的问题。但我使用解决方法:
function ExtractFolderIcon: HICON;
var
Info: TSHStockIconInfo;
Lib: HMODULE;
begin
Info.cbSize := SizeOf(Info);
OleCheck(SHGetStockIconInfo(SIID_FOLDER, SHGSI_ICONLOCATION, Info));
Lib := LoadLibrary(Info.szPath);
if Lib = 0 then RaiseLastOSError;
try
Result := LoadImage(Lib, MAKEINTRESOURCE(-Info.iIcon), IMAGE_ICON, 256, 256, LR_DEFAULTCOLOR);
finally
FreeLibrary(Lib);
end;
end;
左边的图片是用你的 "classic" 方式收到的,右边的是解决方法:
Windows7.
上文件夹的默认图标有问题我习惯用下一个代码获取图标
DWORD flags = directory ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL;
...
HICON largeIcon = NULL;
SHGetFileInfo(filename.c_str(), flags, &shfi, sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX);
IImageList* imageList = NULL;
HRESULT hResult = SHGetImageList(SHIL_JUMBO, IID_IImageList, (void**)&imageList);
if (!imageList || hResult != S_OK)
return NULL;
hResult = imageList->GetIcon(shfi.iIcon, ILD_TRANSPARENT, &largeIcon);
if (hResult != S_OK)
return NULL;
icon = LoadBitmapFromHicon(largeIcon);
DestroyIcon(shfi.hIcon);
DestroyIcon(largeIcon);
但是它 returns 损坏了文件夹的图标。其他的还好。 我在上面应用了灰色滤镜。原来的一个样子。
http://i.stack.imgur.com/IM7pm.png
PS。我在 W8 上看起来不错。
有同样的问题。但我使用解决方法:
function ExtractFolderIcon: HICON;
var
Info: TSHStockIconInfo;
Lib: HMODULE;
begin
Info.cbSize := SizeOf(Info);
OleCheck(SHGetStockIconInfo(SIID_FOLDER, SHGSI_ICONLOCATION, Info));
Lib := LoadLibrary(Info.szPath);
if Lib = 0 then RaiseLastOSError;
try
Result := LoadImage(Lib, MAKEINTRESOURCE(-Info.iIcon), IMAGE_ICON, 256, 256, LR_DEFAULTCOLOR);
finally
FreeLibrary(Lib);
end;
end;
左边的图片是用你的 "classic" 方式收到的,右边的是解决方法: