VC一点通:实现文件夹的缩略图显示
2008-11-14 19:36:31 来源:WEB开发网注意从外壳调用获得的PIDL一般都需要调用ILFree或者IMalloc::Free释放。一个例外是调用函数SHBindToParent获得的相对pidl,因为它是输入的参数完整pidl的一部分,所以不必另外释放。
在新建或者打开“文件”时候,文档需要通知视图当前文件夹的更改,这是通过调用CDocument::UpdateAllViews和重载CView::OnUpdate实现的。视图对这个通知的处理是清除上一个目录的缓存数据,缓存新目录的数据,以及更新文档标题。
打开文件或者目录
为了使用方便,双击列表项时可以在同一窗口打开子目录,或者调用系统的默认处理程序打开文件。如果文件是快捷方式,那么打开快捷方式的目标。
voidCPicViewView::OnDblclk(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMLISTVIEWlpnm=(LPNMLISTVIEW)pNMHDR;
if(lpnm->iItem==-1)return;
*pResult=0;
HRESULThr=S_OK;
LPCITEMIDLISTpidlItem=m_arpFolderItems[lpnm->iItem];
LPITEMIDLISTpidlItemFull=ILCombine(m_pidlFolder,pidlItem);
LPITEMIDLISTpidlItemTarget=NULL;
hr=theApp.SHGetTargetFolderIDList(pidlItemFull,&pidlItemTarget);
if(pidlItemTarget){
if(theApp.ILIsFolder(pidlItemTarget)){
CFolderChangeFolderChange;
FolderChange.m_pidlFolder=pidlItemTarget;
OnFolderChange(&FolderChange);
}
else{
SHELLEXECUTEINFOShExecInfo;
ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask=SEE_MASK_IDLIST;
ShExecInfo.hwnd=NULL;
ShExecInfo.lpVerb=NULL;
ShExecInfo.lpFile=NULL;
ShExecInfo.lpIDList=pidlItemTarget;
ShExecInfo.lpParameters=NULL;
ShExecInfo.lpDirectory=NULL;
ShExecInfo.nShow=SW_MAXIMIZE;
ShExecInfo.hInstApp=NULL;
ShellExecuteEx(&ShExecInfo);
}
m_pMalloc->Free(pidlItemTarget);
m_pMalloc->Free(pidlItemFull);
}
}
性能的优化
为了更好的用户体验,可以使用自定义的图标大小(这需要完全自行绘制列表项的图标区域),用单独的线程来载入图像,或者使用调整到图标大小的缩略图缓冲(这样每次绘制时不必拉伸图像)。但是这超出了本文的范围。有兴趣的读者可以自己试一下。
参考
需要更多信息的话,可以参考
ShellFAQ
List-ViewControlsOverview
UsingList-ViewControls
CustomizingaControl'sApearanceUsingCustomDraw
更多精彩
赞助商链接