天天看點

C++ 擷取選中檔案大圖示

  1. SHGetFileInfo 擷取選中檔案小圖示
SHGetFileInfoA(szFile, FILE_ATTRIBUTE_DIRECTORY, &info, sizeof(info), SHGFI_ICON | SHGFI_DISPLAYNAME)      
  1. 通過SHGetImageList,ImageList_GetIcon 擷取對應的大圖示
HICON CMainWnd::GetDefaultIcon(LPCTSTR szFile)
{
  static bool bInit = false;
  static IImageList *imageList = NULL;
  
  if (!bInit && imageList == NULL)
  {
    bInit = true;
    IID IID_IImageList = { 0 };
    HRESULT hr = IIDFromString(L"{46EB5926-582E-4017-9FDF-E8998DAA0950}", &IID_IImageList);
    ASSERT(SUCCEEDED(hr));
    SHGetImageList(SHIL_EXTRALARGE, IID_IImageList, (void **)(&imageList));
  }
  
  SHFILEINFOA info = { 0 };
  if (SHGetFileInfoA(szFile, FILE_ATTRIBUTE_DIRECTORY, &info, sizeof(info), SHGFI_ICON | SHGFI_DISPLAYNAME))
  {
    HICON hIcon = info.hIcon;
    if (imageList)
    {
      hIcon = ImageList_GetIcon((HIMAGELIST)imageList, info.iIcon, 0);
      if (hIcon)
        DestroyIcon(info.hIcon);
      else
        hIcon = info.hIcon;
    }
    return hIcon;
  }
  return NULL;
}