Flags:=SHGFI_SYSICONINDEX or SHGFI_PIDL or SHGFI_ICON;//SHGFI_ICON or SHGFI_LARGEICON Or SHGFI_PIDL;   New(lpItemID);
   SHGetFileInfo(Pointer(lpItemID),0,FileInfo,SizeOf(FileInfo),Flags);
   ShowMessage(IntToStr(lpItemID.mkid.cb));
   imgHIcon:= FileInfo.hIcon;
   LRtn:=ImageList_AddIcon(ImageList1.Handle,ImgHIcon);这个代码能实现吗?怎么改?

解决方案 »

  1.   

    下面以组合框(ComboBox)为例,说明上述方法。1.        运行Delphi并创建一个新工程; 2.        在Form1上面添加二个元件:      ImageList1和ComboBox1; 3.        选择Form1, 并在Object Inspector窗体中选择Events页的OnCreate事件,编写Form1的OnCreate事件过程如下:   procedure TForm1.FormCreate(Sender: TObject); var   FS:TSearchRec;   icon :HICON;   path:String; begin   //获得C:盘根目录下的所有文件名和子目录   path:='c:\';   FindFirst(path+'*.*',faDirectory ,FS);   icon:=GetIcon(path+FS.Name);   ImageList_AddIcon(ImageList1.Handle,icon);   ComboBox1.Items.Add(FS.Name);   while  FindNext(FS)=0 do     begin        icon:=GetIcon(path+FS.Name);        ImageList_AddIcon(ImageList1.Handle,icon );        ComboBox1.Items.Add(FS.Name);     end;   FindClose(FS);   ComboBox1.ItemIndex:=0;   ComboBox1.Style:=csOwnerDrawVariable; end;   其中GetIcon()是一个自定义函数,代码清单如下:   function TForm1.GetIcon(fName:String): hicon; //获得fName的图标句柄 const   Flags = SHGFI_ICON or SHGFI_SMALLICON; var   FileInfo: TSHFileInfo; Begin   SHGetFileInfo(PChar(fName),               0,               FileInfo,               SizeOf(FileInfo),               Flags);   Result := FileInfo.hIcon ; end;   4.        选择ComboBox1,并在Object Inspector窗体中选择Events页的OnDrawItem事件,编写ComboBox1的OnDrawItem事件过程如下:   procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);   begin      ComboBox1.Canvas.FrameRect(Rect);      //在组合框中绘制图标      ImageList1.Draw(ComboBox1.Canvas,                    Rect.Left+5,                    Rect.Top,                    Index,                    true);     //在组合框中绘制文本     ComboBox1.Canvas.TextOut(Rect.Left+30,                             Rect.Top,                             ComboBox1.Items.Strings[Index]);    end; 5.        在Unit1.pas文件的interface后的uses中添加ShellApi和CommCtrl。 运行该工程我们就会看到在Form1上有一个显示动态图标的组合框,本例在Delphi 4中完成。
      

  2.   

    http://www.scalabium.com/faq/dct0014.htm
    #14: How can I get a system icons? 
    If you want to fill in TImageList the system icon list, then you can write the next: var FileInfo: TSHFileInfo;
    begin
      {to get a small icons}
      imgListSysSmall := TImageList.Create(nil);
      with imgListSysSmall do
      begin
        Handle := SHGetFileInfo('', 0, FileInfo, SizeOf(TSHFileInfo),
          SHGFI_SMALLICON or SHGFI_SYSICONINDEX );
       ShareImages := True;
      end;  {to get a small icons}
      imgListSysLarge := TImageList.Create(nil);
      with imgListSysLarge do
      begin
        Handle := SHGetFileInfo('', 0, FileInfo, SizeOf(TSHFileInfo),
          SHGFI_LARGEICON or SHGFI_SYSICONINDEX );
       ShareImages := True;
      end;
    end;Also if you want to get a "My Computer" icon, you must use the next
    function:var FileInfo: TSHFileInfo;
         PIDL: PItemIDList;
    begin
      SHGetSpecialFolderLocation(Application.Handle, CSIDL_DRIVES, PIDL);
      if SHGetFileInfo(PChar(PIDL), 0, FileInfo, SizeOf(TSHFileInfo),
         SHGFI_PIDL or SHGFI_SYSICONINDEX ) <> 0 then
            Result := FileInfo.iIcon;
    end;In this function you can use the constants from shlobj.pas:  CSIDL_DESKTOP                       = $0000; 
      CSIDL_PROGRAMS                      = $0002; 
      CSIDL_CONTROLS                      = $0003; 
      CSIDL_PRINTERS                      = $0004; 
      CSIDL_PERSONAL                      = $0005; 
      CSIDL_FAVORITES                     = $0006; 
      CSIDL_STARTUP                       = $0007; 
      CSIDL_RECENT                        = $0008; 
      CSIDL_SENDTO                        = $0009; 
      CSIDL_BITBUCKET                     = $000a; 
      CSIDL_STARTMENU                     = $000b; 
      CSIDL_DESKTOPDIRECTORY              = $0010; 
      CSIDL_DRIVES                        = $0011; 
      CSIDL_NETWORK                       = $0012; 
      CSIDL_NETHOOD                       = $0013; 
      CSIDL_FONTS                         = $0014; 
      CSIDL_TEMPLATES                     = $0015; 
      CSIDL_COMMON_STARTMENU              = $0016; 
      CSIDL_COMMON_PROGRAMS               = $0017; 
      CSIDL_COMMON_STARTUP                = $0018; 
      CSIDL_COMMON_DESKTOPDIRECTORY       = $0019; 
      CSIDL_APPDATA                       = $001A; 
      CSIDL_PRINTHOOD                     = $001B; 
      

  3.   

    有专门的组件叫Syslist的,下载来用就不用自己写代码的