学习几个API,大部分参考百度
ExtractIcon用于获取图标文件
HICON ExtractIcon(
HINSTANCE hInst, // instance handle
LPCTSTR lpszExeFileName, // filename of file with icon
UINT nIconIndex // index of icon to extract
);
说明 - 获取包含在可执行文件或 DLL 中的图标数或图标句柄. 图标索引范转从 0 到图标数减. 要获取图标数, 传递 -1.
参数 - hInst 是应用程序实例句柄. 调用 GetClassLong 来获取该值.
lpszExeFileName一个指向要获取相关图标的文件的指针. 该文件可以用在注册表中的应用程序的文件扩展名来关联.
LpiIcon 图标索引 (以零为基数).
返回的是图标的句柄,如果文件里为空,返回值为空
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Forms,
Dialogs, StdCtrls, ExtCtrls, ShellAPI, Menus, Controls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
OpenDialog1: TOpenDialog;
Button2: TButton;
Edit2: TEdit;
Panel1: TPanel;
Image1: TImage;
SaveDialog1: TSaveDialog;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure Edit2Click(Sender: TObject);
private
{ Private declarations }
procedure WMDROPFILES(var Message: TWMDROPFILES); message WM_DROPFILES; //很重要.不能少
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//使用API函数ExtractIcon() 从 .exe 或 .dll中提取icon
{
首先要说明的是下面的三个API函数
VOID DragAcceptFiles(
HWND hWnd, // handle to the registering window
BOOL fAccept // acceptance option
);
DragAcceptFiles函数是用来为拖放文件作初始化, 它的第一个参数hWnd指明目标窗体的
句柄,第二个参数fAccept是一个布尔型变量,为True时 则hWnd所指向的窗体可以接受拖放的文件.
UINT DragQueryFile(
HDROP hDrop, // handle to structure for dropped files
UINT iFile, // index of file to query
LPTSTR lpszFile, // buffer for returned filename
UINT cch // size of buffer for filename
);
DragQueryFile函数用来查询拖放文件的文件名,其 本身的返回值是一个无符号整数,参数hDrop是
一个存放所拖放文件名称的数据结构的句柄, 也就是文件名缓冲区的句柄,需要从Windows消
息WM_DROPFILES中获得.iFile指明所要查询 文件的序号,它有两种取值方式,1.值为十六进制
数FFFFFFFF时,DragQueryFile的返回值为 所拖放文件的数目;2.值在0到拖放文件总数之间时,
DragQueryFile函数将相应序号的文件 名放入参数lpszFile所指向的缓冲区内,若此时lpszFile
的值为NULL,则DragQueryFile会返 回相应文件名的长度.参数cch决定缓冲区的长度,
由于Windows95支持长文件名,它的值不能 设得太小.
VOID DragFinish(
HDROP hDrop // handle to memory to free
);
使用DragFinish函数告诉Windows拖放操作结束,使 其释放文件名缓冲区,它的参数hDrop与DragQueryFiles函数中的一样,也由Windows消息WM_DROPFILES 的hDrop参数获得.
}
procedure TForm1.Button1Click(Sender: TObject);
var TheIcon: TIcon;
begin
OpenDialog1.Execute;
edit1.Text:= OpenDialog1.FileName;
TheIcon := TIcon.Create; //创建TIcon实例
TheIcon.Handle := ExtractIcon(hInstance,Pchar(edit1.Text),0);
if TheIcon.Handle <> 0 then //取得图标
begin
Button2.Enabled:= True;
Edit2.Text:= '输入要保存的文件名';
Panel1.Caption:= '';
N1.Enabled:= True; //激活右键
TheIcon.SaveToFile('temp.cur'); //光标变成取得的图标
screen.Cursors[1000]:= loadcursorfromfile('temp.cur'); //光标写进screen变量里
deletefile('temp.cur'); //删除temp文件
image1.Cursor:= 1000;
end
else
begin
Button2.Enabled:= False;
Panel1.Caption:= '空';
N1.Enabled:= False;
image1.Cursor:=crDefault;
end;
image1.Picture.Icon:= TheIcon;
Form1.Icon:= TheIcon;
TheIcon.Free; //释放内存
end;
procedure TForm1.Button2Click(Sender: TObject);
var TheIcon: TIcon;
begin
SaveDialog1.FileName:= Trim(Edit2.Text);
if SaveDialog1.Execute() then
begin
TheIcon := TIcon.Create;
TheIcon.Handle := ExtractIcon(hInstance,Pchar(edit1.Text),0);
if TheIcon.Handle <> 0 then
begin
TheIcon.SaveToFile(SaveDialog1.FileName+'.ico');
ShowMessage('成功保存: '+SaveDialog1.FileName+'.ico');
end
else
begin
Button2.Enabled:= False;
N1.Enabled:= False;
end;
TheIcon.Free;
end;
end;
procedure TForm1.Edit2Click(Sender: TObject);
begin
if Edit2.Text='输入要保存的文件名' then
Edit2.Text:= '';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.Title:= Form1.Caption;
DragAcceptFiles(Handle,True); // 让窗口接受拖放
end;
procedure TForm1.N1Click(Sender: TObject);
begin
Button2.Click;
end;
procedure TForm1.WMDROPFILES(var Message: TWMDROPFILES);
var NumFiles: longint;
i: longint;
buffer: array[0..255] of char;
TheIcon: TIcon;
begin
{How many files are being dropped}
NumFiles := DragQueryFile(Message.Drop,$FFFFFFFF,nil,0); //获得拖放的文件数量
{Accept the dropped files}
for i := 0 to (NumFiles - 1) do //输出
begin
DragQueryFile(Message.Drop,i,@buffer,sizeof(buffer));
//开始要做的处理
edit1.Text:= buffer;
TheIcon := TIcon.Create;
TheIcon.Handle := ExtractIcon(hInstance,Pchar(edit1.Text),0);
if TheIcon.Handle <> 0 then //取得图标
begin
Button2.Enabled:= True;
Edit2.Text:= '输入要保存的文件名';
Panel1.Caption:= '';
N1.Enabled:= True; //激活右键
TheIcon.SaveToFile('temp.cur'); //光标变成取得的图标
screen.Cursors[1000]:= loadcursorfromfile('temp.cur'); //光标写进screen变量里
deletefile('temp.cur'); //删除temp文件
image1.Cursor:= 1000;
end
else
begin
Button2.Enabled:= False;
Panel1.Caption:= '空';
N1.Enabled:= False;
image1.Cursor:=crDefault;
end;
image1.Picture.Icon:= TheIcon;
Form1.Icon:= TheIcon;
TheIcon.Free;
end;
DragFinish(Message.Drop);
end;
end.
delphi 2007 + xp sp2下运行通过