怎么实现象资源管理器listview那样的,根据不同的目录,文件等等,使用不同的图标
我用SHGetFileInfo获得不同的文件的图标,并加入的img中,并设置成item的image
显示的效果很好,但是选中的使用,图标显示的效果很不好,有点模糊的感觉,
不想资源管理器那样很清爽
说白了,就是想实现资源管理器listview那样的效果
如何解决?

解决方案 »

  1.   

    你可以自己找一些效果好的图标,加载到ImageList,再显示
      

  2.   

    BOOL CTest6Dlg::OnInitDialog()
          {
               CDialog::OnInitDialog();
       
               HIMAGELIST himlSmall;
               HIMAGELIST himlLarge;
               SHFILEINFO sfi;
               char  cSysDir[MAX_PATH];
               CString  strBuf;
      
               memset(cSysDir, 0, MAX_PATH);
       
               GetWindowsDirectory(cSysDir, MAX_PATH);
               strBuf = cSysDir;
               sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("\\")+1));
      
               himlSmall = (HIMAGELIST)SHGetFileInfo ((LPCSTR)cSysDir,  
                          0,  
                          &sfi, 
                          sizeof(SHFILEINFO),  
                          SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
       
               himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir,  
                          0,  
                          &sfi,  
                          sizeof(SHFILEINFO),  
                          SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
       
               if (himlSmall && himlLarge)
               {
                    ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,
                                 (WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);
                    ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,
                                 (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);
               }
               return TRUE;  // return TRUE  unless you set the focus to a control
          }
      
          void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)
          {
               int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);
               CString strSize;
               CFileFind filefind;
      
               //  get file size
               if (filefind.FindFile(lpszFileName))
               {
                    filefind.FindNextFile();
                    strSize.Format("%d", filefind.GetLength());
               }
               else
                    strSize = "0";
       
               // split path and filename
               CString strFileName = lpszFileName;
               CString strPath;
      
               int nPos = strFileName.ReverseFind('\\');
               if (nPos != -1)
               {
                    strPath = strFileName.Left(nPos);
                    strFileName = strFileName.Mid(nPos + 1);
               }
       
               // insert to list
               int nItem = m_list.GetItemCount();
               m_list.InsertItem(nItem, strFileName, nIcon);
               m_list.SetItemText(nItem, 1, strSize);
               m_list.SetItemText(nItem, 2, strFileName.Right(3));
               m_list.SetItemText(nItem, 3, strPath);
          }
      
          int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)
          {
               SHFILEINFO sfi;
               memset(&sfi, 0, sizeof(sfi));
       
               if (bIsDir)
               {
                SHGetFileInfo(lpszPath,  
                             FILE_ATTRIBUTE_DIRECTORY,  
                             &sfi,  
                             sizeof(sfi),  
                             SHGFI_SMALLICON | SHGFI_SYSICONINDEX |
                             SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0));  
                return  sfi.iIcon;
               }
               else
               {
                SHGetFileInfo (lpszPath,  
                             FILE_ATTRIBUTE_NORMAL,  
                             &sfi,  
                             sizeof(sfi),  
                             SHGFI_SMALLICON | SHGFI_SYSICONINDEX |  
                             SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));
                return   sfi.iIcon;
               }
               return  -1;
          }