+++++++++++++++如何提取文件夹的图标!?+++++++++++++(100分)

  • 主题发起人 主题发起人 lonelybug
  • 开始时间 开始时间
L

lonelybug

Unregistered / Unconfirmed
GUEST, unregistred user!
如何想资源管理器左边一样,根据不同的文件夹有不同的图标,还有,我用的是delphi5所以没有delphi6里面的控件,谢谢各位了!
 
(*//
标题:目录转换成菜单项;获取系统图标
说明:示例打开文件
设计:Zswang
日期:2002-01-25
支持:wjhu111@21cn.com
//*)

///////Begin Source
uses
ShellApi;

function GetSystemImageList(mImageList: TImageList): Boolean;
{ 返回系统图标到图形列表中是否成功 }
var
vHandle: THandle;
vSHFileInfo: TSHFileInfo;
begin
FillChar(vSHFileInfo, SizeOf(vSHFileInfo), 0);
vHandle := SHGetFileInfo('', 0, vSHFileInfo, SizeOf(vSHFileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
Result := vHandle <> 0;
mImageList.Handle := vHandle;
mImageList.ShareImages := True;
end; { GetSystemImageList }

function GetIconIndex(mPath: string): Integer;
{ 返回文件或路径所对应的图标序号 }
var
vSHFileInfo: TSHFileInfo;
begin
FillChar(vSHFileInfo, SizeOf(vSHFileInfo), 0);
SHGetFileInfo(PChar(mPath), 0, vSHFileInfo, SizeOf(vSHFileInfo),
SHGFI_SYSICONINDEX);
Result := vSHFileInfo.iIcon;
end; { GetIconIndex }

procedure PathToMenuItem(mDirName: string; mMenuItem: TMenuItem;
mItemClick: TNotifyEvent = nil);
{ 返回目录转换成菜单项是否成功 }
var
vSearchRec: TSearchRec;
vPathName: string;
K: Integer;
vMenuItem: TMenuItem;
begin
vPathName := mDirName + '/*.*';
K := FindFirst(vPathName, faAnyFile, vSearchRec);
while K = 0 do begin
if (vSearchRec.Attr and faDirectory <> 0) and
(Pos(vSearchRec.Name, '..') = 0) then begin
vMenuItem := TMenuItem.Create(mMenuItem.Owner);
vMenuItem.Caption := vSearchRec.Name;
vMenuItem.Hint := mDirName + '/' + vSearchRec.Name;
vMenuItem.ImageIndex := GetIconIndex(mDirName + '/' + vSearchRec.Name);
vMenuItem.OnClick := mItemClick;
mMenuItem.Add(vMenuItem);
PathToMenuItem(mDirName + '/' + vSearchRec.Name, vMenuItem)
end else if (Pos(vSearchRec.Name, '..') = 0) then begin
vMenuItem := TMenuItem.Create(mMenuItem.Owner);
vMenuItem.Caption := vSearchRec.Name;
vMenuItem.Hint := mDirName + '/' + vSearchRec.Name;
vMenuItem.ImageIndex := GetIconIndex(mDirName + '/' + vSearchRec.Name);
vMenuItem.OnClick := mItemClick;
mMenuItem.Add(vMenuItem);
end;
K := FindNext(vSearchRec);
end;
FindClose(vSearchRec);
end; { PathToMenuItem }
///////End Source

///////Begin Demo
{ uses FileCtrl }
procedure TForm1.Button1Click(Sender: TObject);
var
vDirectory: string;
begin
{ 测试时不要选择内容太多的目录 }
if not SelectDirectory('Path', '', vDirectory) then Exit;
MainMenu1.Items.Clear;
PathToMenuItem(vDirectory, MainMenu1.Items, ItemClick);
PopupMenu1.Items.Clear;
PathToMenuItem(vDirectory, PopupMenu1.Items, ItemClick);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
GetSystemImageList(ImageList1);
ImageList1.DrawingStyle := dsTransparent;
MainMenu1.AutoHotkeys := maManual;
MainMenu1.Images := ImageList1;
PopupMenu1.AutoHotkeys := maManual;
PopupMenu1.Images := ImageList1;
end;

procedure TForm1.ItemClick(Sender: TObject);
begin
if FileExists(TMenuItem(Sender).Hint) then //避免目录
ShellExecute(Handle, 'OPEN', PChar(TMenuItem(Sender).Hint), nil, nil, SW_SHOW);
end;
///////End Demo
 
TreeView 和 ImageList一起使用。
指定TreeView.Images为ImageList,然后指定TreeView1.Items.ImageIndex为ImageList中的某一个。
这样可以做到“不同的文件夹有不同的图标”。
 
怎么看不见呢,好奇怪呀
 
自己设计,用TImageList
文件夹的图标可通过文件夹内的一个设置文件进行改变。
 
cxz9:大虾,再帮我一下吧,我要的就是文夹件的图表,可是我用了你的方法发现图标都变成了那种共享文件夹中的手了,不知道,为什么,我主要想知道SHGetFileInfo这个函数里面的参数有没有专门提出文件夹的图标的!谢谢了
jsxjd:这位大虾,你说的那个方法如何使用呢,有么有具体点的东西!谢谢了!
 
接受答案了.
 
你自己去CSDN问Zswang
吧,Delphi的版主。
wjhu111@21cn.com
 
还有一个问题,如何是treeview的item被选中的时候控制它所选中的图标!?
 
后退
顶部