 |
|
VC一点通:实现文件夹的缩略图显示 |
出处:PConline 责任编辑:ljx |
[03-11-21 16:58]
| 作者:jiangsheng/CSDN
| -
然后在获取文件信息时,从文件获得其图标在系统图像列表中的索引。
如果列表项是图像文件,并且从文件成功载入图像,那么使用自画功能以替换默认的图标。
voidCPicViewView::OnCustomDraw(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMLVCUSTOMDRAWlpNMCustomDraw=(LPNMLVCUSTOMDRAW)pNMHDR;
switch(lpNMCustomDraw->nmcd.dwDrawStage){
caseCDDS_PREPAINT:*pResult=CDRF_NOTIFYITEMDRAW;return;
caseCDDS_ITEMPREPAINT:*pResult=CDRF_NOTIFYPOSTPAINT;return;
caseCDDS_ITEMPOSTPAINT:
{
intiItem=lpNMCustomDraw->nmcd.dwItemSpec;
if(iItem==-1){
*pResult=CDRF_DODEFAULT;return;
}
CFolderItemInfo*pItemInfo=FindItemInCache(m_arpFolderItems[iItem]);
if(pItemInfo==NULL||pItemInfo->bFailLoadPic||pItemInfo->pic.m_pPict==NULL){
*pResult=CDRF_DODEFAULT;return;
}
CRectrectIcon;
GetListCtrl().GetItemRect(iItem,&rectIcon,LVIR_ICON);
CDC*pDC=CDC::FromHandle(lpNMCustomDraw->nmcd.hdc);
pItemInfo->pic.Render(pDC,rectIcon,rectIcon);
}
*pResult=CDRF_NEWFONT;return;
}
*pResult=0;
}
上面的代码是使用获取的文件显示信息中的图像,在列表项图标的区域画图。
获取显示信息
为了缓存列表项的显示信息,或者显示列表项,需要获取列表项的文字、图标、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\r\n",pItemInfo->tszPath);
}
}
}
m_pMalloc->Free(pidlItemFull);
}
}
希望看到更多更经典的开发技巧,请随时刷新《开发特区》栏目。
ad
相关文章:
简单设置nView,边看DVD边冲浪
微软Virtual PC 2004投产并将低价入市
Virtual PC 2004将在90天内上市!
Virtual PC2004将不支持Linux
微软VirtualPC 2004新版令人失望
图像多功能一体机
VC++实现拨号上网程序详解
在VC中如何将数据导入Word中
VC编程实现IE风格的界面
微软将于年底发布Virtual PC 2004
| |  | -
|  |