CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

要在ListView中使用很多种图标,怎么办?

楼主echevil(Echevil)2003-03-03 20:51:27 在 .NET技术 / C# 提问

我在做一个文件浏览器,主要用ListView实现。控制ListView中项目的图标只能用ImageList,然后指定ImageIndex,我希望能和Windows的文件浏览器那样,对于不同的文件类型用不同的图标,最好是运行是把图标读出来,请问要怎么办?  
  以前都是预先把几种常见的文件类型的图标加到ImageList中,但我希望能像Explorer那样。 问题点数:50、回复次数:7Top

1 楼chinchy(糟老头)回复于 2003-03-04 09:15:22 得分 20

using   System;  
  using   System.Drawing;  
  using   System.Collections;  
  using   System.ComponentModel;  
  using   System.Data;  
  using   System.Runtime.InteropServices;  
   
   
  namespace   ListView  
  {  
  ///   <summary>  
  ///   Provides   static   methods   to   read   system   icons   for   both   folders   and   files.  
  ///   </summary>  
  ///   <example>  
  ///   <code>IconReader.GetFileIcon("c:\\general.xls");</code>  
  ///   </example>  
  public   class   IconReader  
  {  
  ///   <summary>  
  ///   Options   to   specify   the   size   of   icons   to   return.  
  ///   </summary>  
  public   enum   IconSize  
  {  
  ///   <summary>  
  ///   Specify   large   icon   -   32   pixels   by   32   pixels.  
  ///   </summary>  
  Large   =   0,  
  ///   <summary>  
  ///   Specify   small   icon   -   16   pixels   by   16   pixels.  
  ///   </summary>  
  Small   =   1  
  }  
                   
  ///   <summary>  
  ///   Options   to   specify   whether   folders   should   be   in   the   open   or   closed   state.  
  ///   </summary>  
  public   enum   FolderType  
  {  
  ///   <summary>  
  ///   Specify   open   folder.  
  ///   </summary>  
  Open   =   0,  
  ///   <summary>  
  ///   Specify   closed   folder.  
  ///   </summary>  
  Closed   =   1  
  }  
   
  ///   <summary>  
  ///   Returns   an   icon   for   a   given   file   -   indicated   by   the   name   parameter.  
  ///   </summary>  
  ///   <param   name="name">Pathname   for   file.</param>  
  ///   <param   name="size">Large   or   small</param>  
  ///   <param   name="linkOverlay">Whether   to   include   the   link   icon</param>  
  ///   <returns>System.Drawing.Icon</returns>  
  public   static   System.Drawing.Icon   GetFileIcon(string   name,   IconSize   size,   bool   linkOverlay)  
  {  
  Shell32.SHFILEINFO   shfi   =   new   Shell32.SHFILEINFO();  
  uint   flags   =   Shell32.SHGFI_ICON   |   Shell32.SHGFI_USEFILEATTRIBUTES;  
   
  if   (true   ==   linkOverlay)   flags   +=   Shell32.SHGFI_LINKOVERLAY;  
   
  /*   Check   the   size   specified   for   return.   */  
  if   (IconSize.Small   ==   size)  
  {  
  flags   +=   Shell32.SHGFI_SMALLICON   ;  
  }    
  else    
  {  
  flags   +=   Shell32.SHGFI_LARGEICON   ;  
  }  
   
  Shell32.SHGetFileInfo( name,    
  Shell32.FILE_ATTRIBUTE_NORMAL,    
  ref   shfi,    
  (uint)   System.Runtime.InteropServices.Marshal.SizeOf(shfi),    
  flags   );  
   
  //   Copy   (clone)   the   returned   icon   to   a   new   object,   thus   allowing   us   to   clean-up   properly  
  System.Drawing.Icon   icon   =   (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();  
  User32.DestroyIcon(   shfi.hIcon   ); //   Cleanup  
  return   icon;  
  }  
   
  ///   <summary>  
  ///   Used   to   access   system   folder   icons.  
  ///   </summary>  
  ///   <param   name="size">Specify   large   or   small   icons.</param>  
  ///   <param   name="folderType">Specify   open   or   closed   FolderType.</param>  
  ///   <returns>System.Drawing.Icon</returns>  
  public   static   System.Drawing.Icon   GetFolderIcon(   IconSize   size,   FolderType   folderType   )  
  {  
  //   Need   to   add   size   check,   although   errors   generated   at   present!  
  uint   flags   =   Shell32.SHGFI_ICON   |   Shell32.SHGFI_USEFILEATTRIBUTES;  
   
  if   (FolderType.Open   ==   folderType)  
  {  
  flags   +=   Shell32.SHGFI_OPENICON;  
  }  
   
  if   (IconSize.Small   ==   size)  
  {  
  flags   +=   Shell32.SHGFI_SMALLICON;  
  }    
  else    
  {  
  flags   +=   Shell32.SHGFI_LARGEICON;  
  }  
   
  //   Get   the   folder   icon  
  Shell32.SHFILEINFO   shfi   =   new   Shell32.SHFILEINFO();  
  Shell32.SHGetFileInfo( null,    
  Shell32.FILE_ATTRIBUTE_DIRECTORY,    
  ref   shfi,    
  (uint)   System.Runtime.InteropServices.Marshal.SizeOf(shfi),    
  flags   );  
   
  System.Drawing.Icon.FromHandle(shfi.hIcon); //   Load   the   icon   from   an   HICON   handle  
   
  //   Now   clone   the   icon,   so   that   it   can   be   successfully   stored   in   an   ImageList  
  System.Drawing.Icon   icon   =   (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();  
   
  User32.DestroyIcon(   shfi.hIcon   ); //   Cleanup  
  return   icon;  
  }  
  }  
  Top

2 楼chinchy(糟老头)回复于 2003-03-04 09:15:44 得分 20

///   <summary>  
  ///   Wraps   necessary   Shell32.dll   structures   and   functions   required   to   retrieve   Icon   Handles   using   SHGetFileInfo.   Code  
  ///   courtesy   of   MSDN   Cold   Rooster   Consulting   case   study.  
  ///   </summary>  
  ///    
   
  //   This   code   has   been   left   largely   untouched   from   that   in   the   CRC   example.   The   main   changes   have   been   moving  
  //   the   icon   reading   code   over   to   the   IconReader   type.  
  public   class   Shell32      
  {  
   
  public   const   int   MAX_PATH   =   256;  
  [StructLayout(LayoutKind.Sequential)]  
  public   struct   SHITEMID  
  {  
  public   ushort   cb;  
  [MarshalAs(UnmanagedType.LPArray)]  
  public   byte[]   abID;  
  }  
   
  [StructLayout(LayoutKind.Sequential)]  
  public   struct   ITEMIDLIST  
  {  
  public   SHITEMID   mkid;  
  }  
   
  [StructLayout(LayoutKind.Sequential)]  
  public   struct   BROWSEINFO    
  {    
  public   IntPtr hwndOwner;    
  public   IntPtr pidlRoot;    
  public   IntPtr   pszDisplayName;  
  [MarshalAs(UnmanagedType.LPTStr)]    
  public   string   lpszTitle;    
  public   uint   ulFlags;    
  public   IntPtr lpfn;    
  public   int lParam;    
  public   IntPtr   iImage;    
  }    
   
  //   Browsing   for   directory.  
  public   const   uint   BIF_RETURNONLYFSDIRS       = 0x0001;  
  public   const   uint   BIF_DONTGOBELOWDOMAIN     = 0x0002;  
  public   const   uint   BIF_STATUSTEXT                   = 0x0004;  
  public   const   uint   BIF_RETURNFSANCESTORS     = 0x0008;  
  public   const   uint   BIF_EDITBOX                         = 0x0010;  
  public   const   uint   BIF_VALIDATE                       = 0x0020;  
  public   const   uint   BIF_NEWDIALOGSTYLE           = 0x0040;  
  public   const   uint   BIF_USENEWUI                       = (BIF_NEWDIALOGSTYLE   |   BIF_EDITBOX);  
  public   const   uint   BIF_BROWSEINCLUDEURLS     = 0x0080;  
  public   const   uint   BIF_BROWSEFORCOMPUTER     = 0x1000;  
  public   const   uint   BIF_BROWSEFORPRINTER       = 0x2000;  
  public   const   uint   BIF_BROWSEINCLUDEFILES   = 0x4000;  
  public   const   uint   BIF_SHAREABLE                     = 0x8000;  
   
  [StructLayout(LayoutKind.Sequential)]  
  public   struct   SHFILEINFO  
  {    
  public   const   int   NAMESIZE   =   80;  
  public   IntPtr hIcon;    
  public   int iIcon;    
  public   uint dwAttributes;    
  [MarshalAs(UnmanagedType.ByValTStr,   SizeConst=MAX_PATH)]  
  public   string   szDisplayName;    
  [MarshalAs(UnmanagedType.ByValTStr,   SizeConst=NAMESIZE)]  
  public   string   szTypeName;    
  };  
   
  public   const   uint   SHGFI_ICON =   0x000000100;           //   get   icon  
  public   const   uint   SHGFI_DISPLAYNAME =   0x000000200;           //   get   display   name  
  public   const   uint   SHGFI_TYPENAME                     =   0x000000400;           //   get   type   name  
  public   const   uint   SHGFI_ATTRIBUTES                 =   0x000000800;           //   get   attributes  
  public   const   uint   SHGFI_ICONLOCATION             =   0x000001000;           //   get   icon   location  
  public   const   uint   SHGFI_EXETYPE                       =   0x000002000;           //   return   exe   type  
  public   const   uint   SHGFI_SYSICONINDEX             =   0x000004000;           //   get   system   icon   index  
  public   const   uint   SHGFI_LINKOVERLAY               =   0x000008000;           //   put   a   link   overlay   on   icon  
  public   const   uint   SHGFI_SELECTED                     =   0x000010000;           //   show   icon   in   selected   state  
  public   const   uint   SHGFI_ATTR_SPECIFIED         =   0x000020000;           //   get   only   specified   attributes  
  public   const   uint   SHGFI_LARGEICON                   =   0x000000000;           //   get   large   icon  
  public   const   uint   SHGFI_SMALLICON                   =   0x000000001;           //   get   small   icon  
  public   const   uint   SHGFI_OPENICON                     =   0x000000002;           //   get   open   icon  
  public   const   uint   SHGFI_SHELLICONSIZE           =   0x000000004;           //   get   shell   size   icon  
  public   const   uint   SHGFI_PIDL                             =   0x000000008;           //   pszPath   is   a   pidl  
  public   const   uint   SHGFI_USEFILEATTRIBUTES   =   0x000000010;           //   use   passed   dwFileAttribute  
  public   const   uint   SHGFI_ADDOVERLAYS               =   0x000000020;           //   apply   the   appropriate   overlays  
  public   const   uint   SHGFI_OVERLAYINDEX             =   0x000000040;           //   Get   the   index   of   the   overlay  
   
  public   const   uint   FILE_ATTRIBUTE_DIRECTORY     =   0x00000010;      
  public   const   uint   FILE_ATTRIBUTE_NORMAL           =   0x00000080;      
   
  [DllImport("Shell32.dll")]  
  public   static   extern   IntPtr   SHGetFileInfo(  
  string   pszPath,  
  uint   dwFileAttributes,  
  ref   SHFILEINFO   psfi,  
  uint   cbFileInfo,  
  uint   uFlags  
  );  
  }  
   
  ///   <summary>  
  ///   Wraps   necessary   functions   imported   from   User32.dll.   Code   courtesy   of   MSDN   Cold   Rooster   Consulting   example.  
  ///   </summary>  
  public   class   User32  
  {  
  ///   <summary>  
  ///   Provides   access   to   function   required   to   delete   handle.   This   method   is   used   internally  
  ///   and   is   not   required   to   be   called   separately.  
  ///   </summary>  
  ///   <param   name="hIcon">Pointer   to   icon   handle.</param>  
  ///   <returns>N/A</returns>  
  [DllImport("User32.dll")]  
  public   static   extern   int   DestroyIcon(   IntPtr   hIcon   );  
  }  
  }  
   
  Top

3 楼chinchy(糟老头)回复于 2003-03-04 09:18:50 得分 10

使用:  
  //lvFiles是一个listview  
   
  DirectoryInfo   dirInfo=new   DirectoryInfo(sPath);//spath是目录  
  FileInfo[]   fInfo=dirInfo.GetFiles();  
   
  string[]   sFileItems;  
   
  foreach(FileInfo   fileinfo   in   fInfo)  
  {  
  sFileItems=new   string[]{fileinfo.Name.ToString(),fileinfo.Length.ToString(),getFileType(fileinfo.Extension.ToString()),fileinfo.LastWriteTime.ToString()};  
  //get   icon   of   file  
  this.imglSmallIcon.Images.Add(IconReader.GetFileIcon(fileinfo.FullName.ToString(),IconReader.IconSize.Small,false));  
  this.imglLargeIcon.Images.Add(IconReader.GetFileIcon(fileinfo.FullName.ToString(),IconReader.IconSize.Large,false));  
  //add   item   to   listview  
  this.lvFiles.Items.Add(new   ListViewItem(sFileItems,this.imglSmallIcon.Images.Count-1));  
  }Top

4 楼hbuser(soleracker)回复于 2003-03-04 09:27:35 得分 0

listview有一个属性就是对应IMAGELIST集合,一查就知道Top

5 楼yinwu2003(鹦鹉)回复于 2003-03-04 09:29:37 得分 0

同意楼上的Top

6 楼Brunhild()回复于 2003-03-17 11:43:06 得分 0

markTop

7 楼DannyChen()回复于 2003-03-17 11:59:14 得分 0

markTop

相关问题

  • listview图标---ShGetFileInfo
  • ListView图标大小
  • ListView 图标问题 ?
  • ListView 使用大图标运行时为什么没出现图像?
  • listview 中显示图标
  • listview 中显示图标
  • 大图标与小图标不一样怎么办?
  • 没有选择文档支持,添加ListView不能使用怎么办?
  • 如何使用 XP 图标
  • ListView的图标显示问题?

关键词

  • shell
  • shgfi
  • shfi
  • icon
  • bif
  • iconsize
  • const uint
  • shell32
  • foldertype
  • iconpublic

得分解答快速导航

  • 帖主:echevil
  • chinchy
  • chinchy
  • chinchy

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo