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

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

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
文件图标的显示 默认情况下,列表项的图标就是其系统图标。首先获得系统图像列表 intCPicViewView::OnCreate(LPCREATESTRUCTlpCreateStruct) { if(CListView::OnCreate(lpCrea
  文件图标的显示

  默认情况下,列表项的图标就是其系统图标。首先获得系统图像列表
  
  intCPicViewView::OnCreate(LPCREATESTRUCTlpCreateStruct)
  {
  if(CListView::OnCreate(lpCreateStruct)==-1)
  return-1;
  HRESULThr=SHGetMalloc(&m_pMalloc);if(FAILED(hr))return-1;
  hr=SHGetDesktopFolder(&m_psfDesktop);if(FAILED(hr))return-1;
  SHFILEINFOshfi;
  ZeroMemory(&shfi,sizeof(SHFILEINFO));
  HIMAGELISThi=(HIMAGELIST)SHGetFileInfo(NULL,0,&shfi,sizeof(SHFILEINFO),SHGFI_ICON|SHGFI_SYSICONINDEX|SHGFI_SMALLICON);
  GetListCtrl().SetImageList(CImageList::FromHandle(hi),LVSIL_SMALL);
    hi=(HIMAGELIST)SHGetFileInfo(NULL,0,&shfi,sizeof  (SHFILEINFO),SHGFI_ICON|SHGFI_SYSICONINDEX|SHGFI_LARGEICON);
  GetListCtrl().SetImageList(CImageList::FromHandle(hi),LVSIL_NORMAL);
  return0;
  }

  然后在获取文件信息时,从文件获得其图标在系统图像列表中的索引。
  
  如果列表项是图像文件,并且从文件成功载入图像,那么使用自画功能以替换默认的图标。
  
  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;
  }
  
  上面的代码是使用获取的文件显示信息中的图像,在列表项图标的区域画图。

精彩图集

赞助商链接