如何取得系统图标?

个人网站美丽无瑕 2004-07-12 11:21:30
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);

这个代码能实现吗?怎么改?
...全文
129 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly_liuyang 2004-07-12
  • 打赏
  • 举报
回复
有专门的组件叫Syslist的,下载来用就不用自己写代码的
aiirii 2004-07-12
  • 打赏
  • 举报
回复
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;


飞天揽月 2004-07-12
  • 打赏
  • 举报
回复
下面以组合框(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中完成。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧