如何将图标设置为名称空间扩展中的虚拟文件?
How can I set icons to virtual files in a namespace extension?
我正在尝试将图标添加到命名空间扩展中的虚拟文件。这些文件是 .docx、.pdf 和其他非 windows 默认扩展名,但我不清楚如何执行此操作。 IDefaultExtractIconInit::SetNormalIcon(LPCWSTR pszFile, int iIcon) 接受图标的文件路径和图标 ID。调用 SHGetFileInfo 以获取图标路径和索引失败 return 路径但 return 成功。 SHGetFileInfo 会将 return 正确的图标索引添加到系统图标缓存中,我想使用它,但是将该索引传递给 SetNormalIcon(NULL, idx) 无法设置正确的图标。如何设置文件图标?
STDMETHODIMP CShellFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *rgfReserved, void **ppv) {
*ppv = NULL;
HRESULT hr = E_NOTIMPL;
if (IID_IExtractIcon == riid) {
IDefaultExtractIconInit *pdxi = NULL;
hr = SHCreateDefaultExtractIcon(IID_PPV_ARGS(&pdxi));
if (SUCCEEDED(hr)) {
BOOL isFolder = FALSE;
hr = m_pPidlMgr->IsFolder(apidl[0], &isFolder);
if(SUCCEEDED(hr)) {
pdxi->SetFlags(GIL_FORSHELL);
hr = pdxi->SetNormalIcon(L"Shell32.dll", isFolder ? 4 : 1);
if (SUCCEEDED(hr))
hr = pdxi->QueryInterface(riid, ppv);
}
pdxi->Release();
}
}
return hr;
}
没有真正记录,但是当您将 NULL 作为文件名传递时,索引是 SHSTOCKICONID value, not a system imagelist index! You can see a SIID_*
value used in the example on this page。如果你只知道系统图像列表索引,我不确定 IDefaultExtractIconInit
是否可以使用。
如果您的名称空间扩展 仅 returns 来自系统图像列表的图标,您可能只需在 shell 文件夹中支持 IShellIcon执行。否则,您可能必须创建自定义 IExtractIcon 对象。
我正在尝试将图标添加到命名空间扩展中的虚拟文件。这些文件是 .docx、.pdf 和其他非 windows 默认扩展名,但我不清楚如何执行此操作。 IDefaultExtractIconInit::SetNormalIcon(LPCWSTR pszFile, int iIcon) 接受图标的文件路径和图标 ID。调用 SHGetFileInfo 以获取图标路径和索引失败 return 路径但 return 成功。 SHGetFileInfo 会将 return 正确的图标索引添加到系统图标缓存中,我想使用它,但是将该索引传递给 SetNormalIcon(NULL, idx) 无法设置正确的图标。如何设置文件图标?
STDMETHODIMP CShellFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *rgfReserved, void **ppv) {
*ppv = NULL;
HRESULT hr = E_NOTIMPL;
if (IID_IExtractIcon == riid) {
IDefaultExtractIconInit *pdxi = NULL;
hr = SHCreateDefaultExtractIcon(IID_PPV_ARGS(&pdxi));
if (SUCCEEDED(hr)) {
BOOL isFolder = FALSE;
hr = m_pPidlMgr->IsFolder(apidl[0], &isFolder);
if(SUCCEEDED(hr)) {
pdxi->SetFlags(GIL_FORSHELL);
hr = pdxi->SetNormalIcon(L"Shell32.dll", isFolder ? 4 : 1);
if (SUCCEEDED(hr))
hr = pdxi->QueryInterface(riid, ppv);
}
pdxi->Release();
}
}
return hr;
}
没有真正记录,但是当您将 NULL 作为文件名传递时,索引是 SHSTOCKICONID value, not a system imagelist index! You can see a SIID_*
value used in the example on this page。如果你只知道系统图像列表索引,我不确定 IDefaultExtractIconInit
是否可以使用。
如果您的名称空间扩展 仅 returns 来自系统图像列表的图标,您可能只需在 shell 文件夹中支持 IShellIcon执行。否则,您可能必须创建自定义 IExtractIcon 对象。