根据一个字符串(如“aaa.doc”)获得windows内与之相对应的图标的问题!超级疑难,非高手莫入! (200分)

  • 主题发起人 chemstar
  • 开始时间
C

chemstar

Unregistered / Unconfirmed
GUEST, unregistred user!
我根据一个字符串如‘aaa.doc’(这个文件并不实际存在),通过调用函数<br>来取得doc文件在系统内的图标索引,进而显示在一个listview内,用了如下的代码:<br><br> 请新建一个项目,在form上放一个button和一个listview,并设其viewstyle为vssmallicon<br>,然后用以下代码替掉原来的所有代码:<br> unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils,<br>Classes, Graphics, Controls,<br>Forms, Dialogs, ComCtrls,<br>StdCtrls, ShellAPI, ExtCtrls,<br>ImgList;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; ListView1: TListView;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; &nbsp; procedure FormCreate(Sender: TObject);<br>&nbsp;private<br><br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br>function GetFileIconIndex(FileName: string; Large: Boolean): Integer; &nbsp;{ 获取图标的序号函数 }<br><br>var<br>&nbsp; Ext: string;<br>&nbsp; Flags: Integer;<br>&nbsp; FileInfo: TSHFILEINFO;<br>begin<br>&nbsp; Ext := FileName;<br>&nbsp; Flags := SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_USEFILEATTRIBUTES;<br>&nbsp; if Large then<br>&nbsp; &nbsp; Flags := Flags or SHGFI_LARGEICON<br>&nbsp; else<br>&nbsp; &nbsp; Flags := Flags or SHGFI_SMALLICON;<br>&nbsp; SHGetFileInfo(PChar(Ext), 0, FileInfo, SizeOf(FileInfo), Flags);<br>&nbsp; Result := FileInfo.iIcon;<br>end;<br>procedure TForm1.FormCreate(Sender: TObject);<br>var<br>&nbsp;shFileInfo: TSHFILEINFO;<br>begin<br>&nbsp;with ListView1 do &nbsp; { 分配系统资源给ListView1组件以显示图标 }<br>begin<br>SmallImages:=TImageList.CreateSize(32,32);<br>SmallImages.ShareImages:=True;<br>SmallImages.Handle:=ShGetFileInfo('*.*',0,<br>SHFileInfo, SizeOf(SHFileInfo),<br>SHGFI_LARGEICON or<br>SHGFI_ICON or SHGFI_SYSICONINDEX);<br><br>LargeImages:=TImageList.CreateSize(32,32);<br>LargeImages.ShareImages:=True;<br>LargeImages.Handle:=ShGetFileInfo('*.*',0,<br>SHFileInfo, SizeOf(SHFileInfo),<br>SHGFI_LARGEICON or<br>SHGFI_ICON or SHGFI_SYSICONINDEX);<br>end;<br><br><br>end;<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; listitem:tlistitem;<br>begin<br>&nbsp; ListItem:=ListView1.Items.Add;<br>&nbsp; &nbsp;ListItem.ImageIndex:=GetFileIconIndex('aaa.doc',false) ;<br>end;<br><br>end.<br>程序运行后单击会在listview内显示一个word的图标,但是我在win98下运行很正常,在win2000下却什么<br>也显示不出来!请高手看看是怎么回事!是不是98和2000的函数不一样?<br>
 
http://delphi.mychangshu.com/<br>这里现成的就有
 
我有东东,要的话我可以发给你
 
俺也有,要的话,发信到我的信箱里面<br><br>ty_unix@163.com
 
在网上找吧
 
可以用很多工具从dll、exe、ocx中搞到很多图标!<br>比如EXESCOPE
 
我是想如何给我的treeview中的各种文件名称换成它们在windows中相应的默认的图标?<br>又如何将这些图标存入一个文件中呢?<br>谁有源码?发给我!<br><br>mxmu@sina.com<br>
 
这个要你自己读系统的注册表,非常麻烦
 
没错,你需要根据注册表自己去读取. 先找出扩展名,比如DOC,然后<br>比如: *.DOC类型,你先要找到注册表HKEY_CLASS_ROOT中 .DOC这个KEY中DEFAULT值<br>WORD.DOCUMENT.8,然后再在WORD.DOCUMENT.8这个KEY下找有一项DEFAULTICON,<br>它指定了该类型的缺省默认图标.
 
---- 下面是演示程序<br>---- 该演示程序可以显示各类Windows系统图标,包括文件图标、磁盘图标、文件夹图标、用户特定可执行文件图标(如:Delphi的火炬图标等等)。有趣的是,我们显示的这些图标没有一个需要我们自己亲自动手绘制。<br>---- 请先在Delphi环境下建立一个窗体Form1,并在Form1中添加一个按钮Button1和一个列表框ListView1;然后请设置ListView1的属性ViewStyle为vsIcon。<br>---- 源程序清单:<br>unit Unit1;<br>interface<br>uses<br>Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,ComCtrls,StdCtrls,ShellAPI,ExtCtrls,<br>ImgList;<br>type<br>TForm1 = class(TForm)<br>ListView1: TListView;<br>Button1: TButton;<br>procedure FormDestroy(Sender: TObject);<br>procedure FormCreate(Sender: TObject);<br>procedure Button1Click(Sender: TObject);<br>private<br>{ Private declarations }<br>public<br>{ Public declarations }<br>end;<br>const<br>Test='C:/';<br>{ Test为测试数据,在本例中返回的是一个驱动器图标。读者<br>可以自行选择其他测试数据如:Test:='C:/Autoexec.bat'<br>等等。}<br>var<br>Form1: TForm1;<br>ShFileInfo: TSHFILEINFO;<br>implementation<br>{$R *.DFM}<br>function GetFileIconIndex(FileName:string):integer;<br>{ 获取图标的序号函数 }<br>var<br>Ext:String;<br>begin<br>Ext:=FileName;<br>Result:=ShGetFileInfo(Pchar(Ext),0,SHFileInfo,SizeOf(SHFileInfo),SHGFI_LARGEICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME);<br>Result:=SHFileInfo.iIcon;<br>{ 返回获取的图标序号 }<br>end;<br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>with ListView1 do<br>begin<br>SmallImages:=TImageList.CreateSize(32,32);<br>SmallImages.ShareImages:=True<br>SmallImages.Handle:=ShGetFileInfo('*.*',0,SHFileInfo,SizeOf(SHFileInfo),<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SHGFI_LARGEICON or SHGFI_ICON or SHGFI_SYSICONINDEX);<br>LargeImages:=TImageList.CreateSize(32,32);<br>LargeImages.ShareImages:=True;<br>LargeImages.Handle:=ShGetFileInfo('*.*',0,SHFileInfo,SizeOf(SHFileInfo),<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SHGFI_LARGEICON or SHGFI_ICON or SHGFI_SYSICONINDEX);<br>end;<br>{ 分配系统资源给ListView1组件以显示图标 }<br>end;<br>procedure TForm1.FormDestroy(Sender: TObject);<br>begin<br>ListView1.SmallImages.Free;<br>ListView1.LargeImages.Free;<br>{ 释放ListView1占用的系统资源 }<br>end;<br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>ListView1.Items.Item[0].ImageIndex:=GetFileIconIndex(Test);<br>{ 为ListView1中的第一个项目绘制图标 }<br>end;<br><br><br>end.<br>
 
<br>获取图标容易,但是要保存为256色以上的就困难了!<br><br>谁能给出保存为256色以上的图标到.ICO文件的代码,我出150分,绝不失言。<br><br>email:<br>&nbsp; wqlem@km169.net<br><br>
 
book523兄:<br>    你给出的这段代蚂好像运行不能通过呀。而且我是要取得某“种”文件的图标,<br>而不是某“个”文件的图标。最终的函数应是这样的,比如要想取得doc文件的图标,就用这<br>样的函数:GetFileIcon("DOC")。<br>  极盼回应。<br>peng_qs兄:<br>  你只给出了到注册表中找出对应的图标名称,但是它的图标并不保存在这里呀。<br>最好也教给我怎样将取得的图标动态的保存在某个文件里面,比如:dll里面。就是<br>数据库也行呀。<br>  不要笑话我菜呀。
 
再用API函数ExtractIcon就可以取得啊.
 
图标提取程序的源代码:<br>http://www.kitoosoft.com/download/soft.asp?id=26
 
我的朋友kinee写了一个,<br>antic_ant.delphibbs.com是有连接,他提供源码的
 
这个问题好长时间了,但总是没有人能解决,真是有点失望了。大家似乎总是误解我的意思。<br>我的意思是这样的(再说一遍):<br> 我是要取得某“种”文件的图标,而不是某“个”文件的图标。最终的函数应是这样的,<br>比如要想取得doc文件的图标,就用类似这样的函数:GetFileIcon("DOC")。<br><br>有谁能帮我,我可以多送分。
 
我这个函数完全满足你的要求:<br>function GetFileIcon(const DocFileNameExt: string): string; <br>var <br>FileClass: string; <br>Reg: TRegistry; <br>begin <br>Result := ''; <br>Reg := TRegistry.Create(KEY_EXECUTE); <br>Reg.RootKey := HKEY_CLASSES_ROOT; <br>FileClass := ''; <br>if Reg.OpenKeyReadOnly(DocFileNameExt) then <br>begin <br>FileClass := Reg.ReadString(''); <br>Reg.CloseKey; <br>end; <br>if FileClass &lt;&gt; '' then begin <br>if Reg.OpenKeyReadOnly(FileClass + '/Shell/DefaultIcon') then <br>begin <br>Result := Reg.ReadString(''); <br>Reg.CloseKey; <br>end; <br>end; <br>Reg.Free; <br>end;<br><br>
 
这个函数得到的是对应的图标路径或应用程序路径:<br>如realplay的 c:/program files/real/realplayer/realplayer.exe,1<br>表示该应用程序的第一个图标,然后再用以上朋友说的ExtractIcon函数提取图标,<br>如果是直接指明路径的,如<br>c:/program files/real/realplayer/realicon.ico<br>就不用提取了。<br><br>
 
感谢“我爱PASCAL”兄大力协助,但仍有几点不明:<br>1、以rm文件为例,只要装了realplayer,所有的扩展名为rm的文件都会变为<br>realplayer的图标(如果建立了关联的话),但这时即使将realplayer删掉(不是卸掉) ,<br>rm文件的图标仍然不会改掉,这说明资源管理器并不是每次启动都从realpalyer里面读取的,<br>而是在第一次安装时就已经将它的图标保存在一个地方了。我的问题是:这个地方在哪里,<br>我又该如何从这个地方找到我所需要的图标。<br>2、如果有两种程序都能打开rm文件,比如:realplayer和超级解霸。如果realplayer装的<br>晚的话,那么rm文件的图标应该为realplayer的,但这时若将realplayer卸掉,这时rm文件<br>的图标会自动改为“超解”的图标(当然关联也改了)。当然,如果windows内没有安装可<br>以打开rm文件的程序,这时rm的图标会变为windows的默认文件图标。这说明rm文件的关联<br>情况在系统内是有好几个选择的,这种选择记录在哪里呢?windows的默认图标又存在哪里呢?<br><br>以上两点不明,极盼给予解答,当以高分相报!!还可另多送分!
 
顶部