【问题标题】:How to get a Folder icon with a preview?如何获得带有预览的文件夹图标?
【发布时间】:2019-11-13 10:15:14
【问题描述】:

我想让一个文件夹图标看起来像这样

但我实际上让它看起来像这样

.

我的实现:

HICON GetSystemIcon(IShellFolder* folder, PCIDLIST_ABSOLUTE idpl) {
  IExtractIcon* extract_icon;
  folder->GetUIObjectOf(NULL, 1, &idpl, IID_IExtractIcon, NULL, (void**)&extract_icon);
  wchar_t icon_file[MAX_PATH] = {0};
  int icon_index = 0;
  UINT flag = GIL_SIMULATEDOC;
  extract_icon->GetIconLocation(GIL_FORSHELL, icon_file, MAX_PATH, &icon_index, &flag);
  HICON small_icon = NULL;
  HICON large_icon = NULL;
  UINT size = MAKELONG(32, 32);
  extract_icon->Extract(icon_file, icon_index, &large_icon, &small_icon, size);
}

我应该如何改变它?

【问题讨论】:

标签: c winapi icons


【解决方案1】:

这是一个用于此目的的官方示例,您可以使用或参考:“Image Factory API Sample”。它演示了如何使用 IShellItemImageFactory 接口为项目获取最佳图像。

并确保您的文件夹与文件资源管理器中的预期完全一致。

这是我的目标文件夹:

这是我使用示例得到的:

核心相关代码行:

        HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
        if (SUCCEEDED(hr))
        {
            // Getting the IShellItemImageFactory interface pointer for the file.
            IShellItemImageFactory *pImageFactory;
            hr = SHCreateItemFromParsingName(argv[2], NULL, IID_PPV_ARGS(&pImageFactory));
            if (SUCCEEDED(hr))
            {
                SIZE size = { nSize, nSize };

                //sz - Size of the image, SIIGBF_BIGGERSIZEOK - GetImage will stretch down the bitmap (preserving aspect ratio)
                HBITMAP hbmp;
                hr = pImageFactory->GetImage(size, SIIGBF_BIGGERSIZEOK, &hbmp);
                if (SUCCEEDED(hr))
                {
                    DialogBoxParamW(NULL, MAKEINTRESOURCEW(IDD_DIALOG1), NULL, DialogProc, (LPARAM)hbmp);
                    DeleteObject(hbmp);
                }
                else
                {
                    pwszError = L"IShellItemImageFactory::GetImage failed with error code %x";
                }

                pImageFactory->Release();
            }
            else
            {
                pwszError = L"SHCreateItemFromParsingName failed with error %x";
            }

            CoUninitialize();
        }

【讨论】:

  • 谢谢,我想这应该是我想要的效果。
猜你喜欢
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多