VC一点通:实现文件夹的缩略图显示(3)
为了缓存列表项的显示信息,或者显示列表项,需要获取列表项的文字、图标、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());
}
}
- 上一篇:VC初学者经典错误LNK2001详解
- 下一篇:SSE指令介绍及其C、C++应用