【发布时间】:2019-07-10 09:24:09
【问题描述】:
我有一个带有图标处理程序的外壳扩展程序,它根据文件内容将文件类型的图标设置为绿色或红色图标。这些图标似乎可以正常工作,只是在使用大图标时它们真的很模糊,就好像它们是从一个非常小的尺寸放大的一样。图标.ico 文件包含从 256x256 到 16x16 的所有图像尺寸。
我正在使用一个非常基本的图标处理程序,但缓存或其他东西可能仍然存在一些问题。如何确保图标加载正确?
HRESULT icon_handler::GetIconLocation(UINT u_flags, PWSTR psz_icon_file, UINT cch_max, int* pi_index, UINT* pw_flags)
{
*pw_flags = GIL_NOTFILENAME | GIL_DONTCACHE;
return S_OK;
}
HRESULT icon_handler::Extract(PCWSTR psz_file, UINT n_icon_index, HICON* phicon_large, HICON* phicon_small, UINT n_icon_size)
{
int icon = ICON_GREEN;
if (m_icon_color_ == 1) {
icon = ICON_RED;
}
if (phicon_large != nullptr)
{
const int large_size = LOWORD(n_icon_size);
*phicon_large = HICON(LoadImageW(global_h_instance, MAKEINTRESOURCE(icon), IMAGE_ICON, large_size, large_size,
LR_DEFAULTCOLOR));
}
if (phicon_small != nullptr)
{
const int small_size = HIWORD(n_icon_size);
*phicon_small = HICON(LoadImageW(global_h_instance, MAKEINTRESOURCE(icon), IMAGE_ICON, small_size, small_size,
LR_DEFAULTCOLOR));
}
return S_OK;
}
当使用 DebugView 记录时,图标处理程序似乎要求适当的大小:
[30100] phicon_large size:
[30100] 256
[30100] phicon_small size:
[30100] 16
编辑:
根据@Anders,如果我检查使用LoadImage 加载的图像的大小,它似乎也是正确的:
*phicon_large = HICON(LoadImageW(global_h_instance, MAKEINTRESOURCE(icon), IMAGE_ICON, large_size, large_size,
LR_DEFAULTCOLOR));
ICONINFOEXW info = {sizeof(ICONINFOEXW)};
GetIconInfoEx(*phicon_large, &info)
BITMAP bmp;
GetObjectW(info.hbmMask, sizeof(BITMAP), &bmp);
OutputDebugStringW(L"Icon size:");
OutputDebugStringW(std::to_wstring(bmp.bmWidth).c_str());
[12376] phicon_large size:
[12376] 256
[12376] Icon size:
[12376] 256
[12376] phicon_small size:
[12376] 16
[12376] Icon size:
[12376] 16
【问题讨论】:
-
用
GetIconInfoEx检查你从LoadImage得到的图标,看看它的大小是否正确。 -
谢谢,我检查了这个,加载图像的大小似乎也正确。
-
不确定这是否适用于此,但值得一看:How do I override the default icon selection algorithm?
-
接下来要尝试的事情:向 16x16 图标添加一些内容,以确保它不是用作大图标的那个图标。如果这没有帮助,请尝试对每个资源使用单个图标图像大小(HICON 可以包含链接回加载它的文件的秘密信息)。
-
最初传递给 GetIconLocation (u_flags) 的标志是什么?