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

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

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
打开文件夹 本应用程序显示文件夹的内容而不是显示文档的内容,所以我重载了打开文件时的处理,显示目录选择对话框而不是文件打开对话框。 voidCP
  打开文件夹

  本应用程序显示文件夹的内容而不是显示文档的内容,所以我重载了打开文件时的处理,显示目录选择对话框而不是文件打开对话框。
  
  voidCPicViewApp::OnFileOpen()
  {
  TCHARtszDisplayName[_MAX_PATH];
  TCHARtszPathSelected[_MAX_PATH];
  LPITEMIDLISTpidlSelected=PidlBrowse(m_pMainWnd->GetSafeHwnd(),0,tszDisplayName);
  if(pidlSelected){
  if(SHGetPathFromIDList(pidlSelected,tszPathSelected)){
  CDocument*pDocument=OpenDocumentFile(tszPathSelected);
  pDocument->SetTitle(tszDisplayName);
  ILFree(pidlSelected);
  }
  }
  }

  注意从外壳调用获得的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

精彩图集

赞助商链接