龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC一点通:实现文件夹的缩略图显示(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
获取显示信息 为了缓存列表项的显示信息,或者显示列表项,需要获取列表项的文字、图标、Overlay图标和缩略图等信息。这里使用了ILCombine来把缓存中的
  获取显示信息

  为了缓存列表项的显示信息,或者显示列表项,需要获取列表项的文字、图标、Overlay图标和缩略图等信息。这里使用了ILCombine来把缓存中的相对PIDL转化为完整的Pidl,再据此获得文件的完整路径,然后调用OleLoadPicturePath函数载入图像。
  
 voidCPicViewView::GetItemInfo(LPCITEMIDLISTpidl,CFolderItemInfo*pItemInfo)
  {
  HRESULThr=theApp.SHGetDisplayNameOf(pidl,pItemInfo->tszDisplayName);
  IShellIcon*pShellIcon=NULL;
  hr=m_psfFolder->QueryInterface(IID_IShellIcon,(LPVOID*)&pShellIcon);
  if(SUCCEEDED(hr)&&pShellIcon){
  pShellIcon->GetIconOf(pidl,0,&pItemInfo->iIcon);
  pShellIcon->Release();
  }
  IShellIconOverlay*pShellIconOverlay=NULL;
  hr=m_psfFolder->QueryInterface(IID_IShellIconOverlay,(LPVOID*)    &pShellIconOverlay);
  if(SUCCEEDED(hr)&&pShellIconOverlay){
  intnOverlay=0;
  pShellIconOverlay->GetOverlayIndex(pidl,&nOverlay);
  pItemInfo->state=INDEXTOOVERLAYMASK(nOverlay);
  pShellIconOverlay->Release();
  }
  LPITEMIDLISTpidlItemFull=ILCombine(m_pidlFolder,pidl);
  if(pidlItemFull){
  if(SHGetPathFromIDList(pidlItemFull,pItemInfo->tszPath)){
  USES_CONVERSION;
  hr=OleLoadPicturePath(
  T2OLE(pItemInfo->tszPath)
  ,NULL,0,RGB(255,255,255)
  ,IID_IPicture,(LPVOID*)&pItemInfo->pic.m_pPict);
  if(FAILED(hr)){
  pItemInfo->bFailLoadPic=TRUE;
  TRACE("OleLoadPicturePathfailed%s ",pItemInfo->tszPath);
  }
  }
  }
  m_pMalloc->Free(pidlItemFull);
  }
  }

缓存目录的数据

  在更改目录时,需要重建目录内容的缓存。这包括目录的pidl和IShellFolder接口指针,目录内容的相对pidl,以及列表项的显示信息(基于性能上的考虑,列表项的显示信息是在接收到LVN_ODCACHEHINT通知的时候缓存的)。
  
  LPITEMIDLISTm_pidlFolder;
  IShellFolder*m_psfFolder;
  CTypedPtrArraym_arpFolderItems;
  CTypedPtrMapm_mapCache;

  voidCPicViewView::EnterFolder(LPCITEMIDLISTpidl)
  {
  USES_CONVERSION;
  m_pidlFolder=ILClone(pidl);
  if(m_pidlFolder){
  LPENUMIDLISTppenum=NULL;
  LPITEMIDLISTpidlItems=NULL;
  ULONGceltFetched;
  HRESULThr;
  hr=m_psfDesktop->BindToObject(m_pidlFolder,NULL,IID_IShellFolder,(LPVOID*)  &m_psfFolder);
  if(SUCCEEDED(hr)){
  hr=m_psfFolder->EnumObjects(NULL,SHCONTF_FOLDERS|SHCONTF_NONFOLDERS,&ppenum);
  if(SUCCEEDED(hr)){
  while(hr=ppenum->Next(1,&pidlItems,&celtFetched)==S_OK&&(celtFetched)==1){
  m_arpFolderItems.Add(pidlItems);
  }
  }
  }
  GetListCtrl().SetItemCount(m_arpFolderItems.GetSize());
  }
  }
  

精彩图集

赞助商链接