从图标处理程序外壳扩展中的资源加载位图图标

时间:2019-04-10 09:53:22

标签: windows winapi shell-extensions

我需要从.bmp中的资源中加载一个IExtractIcon::Extract图标,但是我无法弄清楚为什么它不起作用。我不断得到一个黑色或白色的矩形,应该在该图标所在的位置。

enter image description here

我在项目资源.rc文件中声明了两个图标:ICON_16_BITMAPICON_BITMAP。这些图标一定要加载,因为它们在LoadImageW之后不为空。

// IExtractIcon

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;
}

extern HINSTANCE global_h_instance;

HRESULT icon_handler::Extract(PCWSTR psz_file, UINT n_icon_index, HICON* phicon_large, HICON* phicon_small, UINT n_icon_size)
{
    const int small_size = HIWORD(n_icon_size);
    const int large_size = LOWORD(n_icon_size);

    if (phicon_large != nullptr)
    {
        OutputDebugStringW((L"Extract large icon: " + std::to_wstring(large_size)).c_str());

        *phicon_large = HICON(LoadImageW(global_h_instance, MAKEINTRESOURCE(ICON_BITMAP), IMAGE_BITMAP, large_size, large_size,
            LR_SHARED));
    }
    if (phicon_small != nullptr)
    {
        OutputDebugStringW((L"Extract small icon: " + std::to_wstring(small_size)).c_str());

        *phicon_small = HICON(LoadImageW(global_h_instance, MAKEINTRESOURCE(ICON_16_BITMAP), IMAGE_BITMAP, small_size, small_size,
            LR_SHARED));
    }

    return S_OK;
}

我尝试遵循许多教程,但这似乎很简单,但是到目前为止还没有解决。是否有任何迹象表明该图标不起作用?

1 个答案:

答案 0 :(得分:1)

BMP与图标格式不同。

  

不能强制使用HICON进行转换。

最简单的方法是通过转换图像工具将BMP文件转换为图标文件,然后将其加载到资源中。