怎么样在listbox中显示图标 ( 积分: 100 )

  • 主题发起人 主题发起人 bill_max
  • 开始时间 开始时间
B

bill_max

Unregistered / Unconfirmed
GUEST, unregistred user!
想在listbox中专门显示EXE,DLL,ICO文件中的图标。怎么样实现?
 
OnDrawItem事件里自画了。
 
ImageList.Draw

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;

Panel: TStatusPanel; const Rect: TRect);
begin
with StatusBar1.Canvas do
begin
Brush.Color := clRed;
FillRect(Rect);
Font.Color := clYellow;
ImageList1.Draw(StatusBar1.Canvas,Rect.Left,Rect.Top,Panel.Index);
TextOut(Rect.left + 30, Rect.top + 2, 'Panel' + IntToStr(Panel.Index));
end;
end;
 
创建一个timagelist类,把那些图标写到该类中,
然后把listview的imagelist属性指向该类
 
我的意思是:
选定一个包含有“图标”的文件(exe,dll,或 ico),然后就能自动在旁边的
listbox中显示出这个文件所包含的所有 图标。不需要在listbox中显示文字什么的,只要图标。
我对listbox不属性,找了一下午都没找到方法。
或者有别的什么控件或者方法懂的也请告诉我。
 
WINSHELLAPI DWORD WINAPI SHGetFileInfo(
LPCSTR pszPath,
DWORD dwFileAttributes,
SHFILEINFO FAR *psfi,
UINT cbFileInfo,
UINT uFlags
);
它的作用是:取回文件系统中的一个对象的信息,对象可以是文件、文件夹、
目录或驱动器的根目录,包括大图标、小图标,象资源管理器上的那样。
操作过程大体如下:
var ShFileInfo: TSHFILEINFO;
FileList:TListView;
begin
...
Result := FileList.Items.Add;
with Result do
begin
Caption:=filename;
ShGetFileInfo(pchar(vartostr(filename)), 0, SHFileInfo, SizeOf(SHFileInfo),
SHGFI_SMALLICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME)=0 then
showmessage('error in shgetfileinfo');
ImageIndex := SHFileInfo.iIcon;
end;
...
end;

***********************************************************************

ExtractAssociatedIcon()和ExtractIcon()函数,
也可以提取文件的图标,但是速度要慢上许多

uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
var
Icon : hIcon;
IconIndex : word;

begin
Icon := ExtractAssociatedIcon(HInstance,
'C:/SomePath/SomeFile.ext',
IconIndex);
DrawIcon(Form1.Canvas.Handle, 10, 10, Icon);
end;
 
当我们要用LISTVIEW控件来列出文件时,怎么让LISTBIEW显示文件自己的图标,
下面的程序可以让你做到。(一个单元列子)

unit mainf;
interface
uses
加入 shellapi,CommCtrl;
type
Tform1 = class(TForm)
ListView1: TListView;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
form1: Tform1;
B_ImageListHandle: THandle;//大图标集句柄
S_ImageListHandle: THandle;//小图标集句柄

implementation

{$R *.DFM}

{Form 创建过程}
procedure Tform1.FormCreate(Sender: TObject);
var
FileInfo: TSHFileInfo;
begin
//取得小图标集句柄
S_ImageListHandle := SHGetFileInfo('C:/',0,FileInfo,
SizeOf(FileInfo),SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
//将小图标集句柄指给列表
SendMessage(Listview1.Handle, LVM_SETIMAGELIST, LVSIL_SMALL, S_ImageListHandle);
//取得大图标集句柄
B_ImageListHandle := SHGetFileInfo('C:/',0,FileInfo,SizeOf(FileInfo),
SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
//将大图标集句柄指给列表
SendMessage(FileList.Handle, LVM_SETIMAGELIST, LVSIL_NORMAL, B_ImageListHandle);
end;

现在你可以在其它的事件中,如OnChange取得文件的图标索引信息,然后指定ListView的ImageIndex
procedure Tform1.listviewChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
var ShFileInfo: TSHFILEINFO;
begin
//........这里是搜索文件和增加列表项的语句....................
WITH listview.items.add DO
Caption:='新文件名';
SubItems.Strings[0]:='ABCDKDDKDKDKD';
//..............开始取得文件图标索引
IF ShGetFileInfo(pchar(路径加+文件名), 0, SHFileInfo,SizeOf(SHFileInfo),
SHGFI_SMALLICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME)<>0 then
Item.Imageindex:=SHFileInfo.iIcon
else
Item.Imageindex:=0;
end;
 
这个程序要会两步做:
1、取EXE、DLL、ICO等类型的图标会到一个类里面。如:TImageList
2、是将类里的图标重新画到Tlistbox中。
 
下面程序我调试过,ok

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,shellapi, ExtCtrls, StdCtrls, ComCtrls, ImgList;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
TreeView1: TTreeView;
ImageList1: TImageList;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
ImageList:THandle;
FileInfo:TSHFileInfo;
TreeNode:TTreeNode;
begin
ImageList:=SHGetFileInfo('c:/',0,FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
ImageList1.Handle:=ImageList;
ImageList1.ShareImages:=true;
SHGetFileInfo('.bmp',0,FileInfo,sizeof(FileInfo),SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SMALLICON);
TreeNode:=TreeView1.Items.Add(nil,'*.bmp');
TreeNode.ImageIndex :=FileInfo.iIcon;
end;

end.
 
虽然我不懂但是帮你顶~^_^
 
多人接受答案了。
 
后退
顶部