我的代码如下:var
  str:TStrings;
  strs:PChar;
  i:Integer;
  Flag: Integer;
  info: TSHFILEINFO;
  Icon: TIcon;
begin
    strs:=rm_list;
    str:=TStringList.Create;
    ExtractStrings(['/'],[' '],strs,str);
    for i:=0 to str.Count-1 do
    begin
     rm_diskview.SmallImages := ImageList1;
     Icon := TIcon.Create;
     form1.rm_diskview.Items.Add;   //添加内容
      Form1.rm_diskview.Items[Form1.rm_diskview.Items.Count-1].Caption:=str[i];
     Flag := (SHGFI_DISPLAYNAME or SHGFI_TYPENAME or SHGFI_SMALLICON or SHGFI_ICON );
     SHGetFileInfo(Pchar('C:\'+str[i]), 0, info, Sizeof(info), Flag);
     Icon.Handle := info.hIcon;
     Form1.ImageList1.AddIcon(Icon);
     Form1.rm_diskview.Items[Form1.rm_diskview.Items.Count-1].ImageIndex := Form1.ImageList1.Count - 1;
    end;
end;
以上代码其中我把flag变成:Flag := (SHGFI_DISPLAYNAME or SHGFI_TYPENAME or SHGFI_SMALLICON or SHGFI_ICON or SHGFI_USEFILEATTRIBUTES );的时候,就会显示本地文件类型的图标,如txt.exe.rar,但是无法显示文件夹的图标。
可是如果不加SHGFI_USEFILEATTRIBUTES的时候就只显示文件夹的图标,本地类型的图标也变成文件夹的图标了,请问各位,这是怎么回事?该如何去做呢?by the way在listview中,大图标与小图标如何切换?第一个问题是最重要的,谢谢各位了!!!又答案就结贴给分!!!

解决方案 »

  1.   

    取文件夹图标和文件图标是不一样的,所以你自己需要能够区分开是否文件夹。大图标与小图标的切换,由ListView的视图决定,当然也可以由ImageList当中设置的图标大小来决定。
      

  2.   

    给你两个函数吧, 这是我以前弄的
    function GetFileIconByExt(const ExtName:string;SmallIcon:boolean):HICON;
    var
      sinfo: SHFILEINFO;
      sFlag: INTEGER;
    begin
         ZeroMemory(@sinfo, sizeof(sinfo));
         if smallicon then
            sflag:=( SHGFI_USEFILEATTRIBUTES or SHGFI_SMAllICON or SHGFI_ICON)
         else
            sflag:=( SHGFI_USEFILEATTRIBUTES or SHGFI_LARGEICON or SHGFI_ICON);
         SHGetFileInfo(pchar(ExtName), FILE_ATTRIBUTE_NORMAL,sinfo,sizeof(sinfo), sflag);
         Result := sinfo.hIcon; //返回ICON的指针
    end;function TFmain.GetIconIndexByImageList(ExtName:string):integer;
    var
    i:integer;
    begin
    for i:=5 to ExtList.Count-1 do
      if ExtName=Extlist[i] then
         begin
         result:=i;
         break;
         exit;
         end;
    ImageList_AddIcon(self.FileSmallIcons.Handle,GetFileIconByExt(ExtName,true));
    ImageList_AddIcon(FileIcons.Handle,GetFileIconByExt(ExtName,false));
    ExtList.Add(ExtName);
    result:=ExtList.Count-1;
    end;