调用API函数ExtractIcon可以提取出在程序文件中的图标,它的头文件是shellapi.h,原型为:
HICON ExtractIcon
(
HINSTANCE hInst, //实例句柄
LPCTSTR lpszExeFileName, //要提取图标的那个程序的文件名
UINT nIconIndex //要提取的图标的索引
);
调用该函数时,参数hInst一般设为当前应用程序的实例句柄,如:Form1->Handle。
参数lpszExeFileName为需要提取图标的程序文件的完整路径,这个程序文件可以是EXE文件、DLL文件、ICO文件等,只要是包含有图标资源的文件一般都可以提取图标。
当参数nIconIndex指定一个图标的索引可以返回指向图标的句柄,如指定的文件中不存在图标,则返回零,当参数nIconIndex设为-1,函数返回文件的图标总数。
函数返回的句柄可以赋给一个用TIcon类声明的变量,再使用该变量的SaveToFile方法就可以把图标保存出来。
例子:
TIcon *Icon = new TIcon();
nsiString FileName = "C:\WINDOWS\SYSTEM\SHELL32.DLL;
int TotalIcon;
//得到文件SHELL32.DLL的总图标数
TotalIcon = (int)ExtractIcon(Form1->Handle,FileName.c_str(), -1);
//提取第一个图标,0为第一个,1为第二个,类推...
Icon->Handle = ExtractIcon( Form1->Handle, FileName.c_str(), 0);
//保存图标
con->SaveToFile("C:\1.ICO);
下面给出一个完整的图标提取程序源码。
这个程序需要四个按钮控件(Button)、四个文本标签控件(Label)、两个文本框控件(Edit)、一个水平滚动条控件(ScrollBar)、一个打开文件对话框控件(OpenDialog)、一个保存文件对话框控件(SaveDialog)和一个图片控件(Image),还有一个Panel控件是装饰用的。界面如图所示:
把各个控件排列好,再把四个Label控件的Caption属性修改一个,最后输入程序代码,运行程序,一个提取图标的程序就出来了,你以后也就不会为没有图标资源可用而发愁了。
程序清单(Unit1.cpp):
//----------------------------------------------------------------
#include;
#pragma hdrstop
include "Unit1.h
//----------------------------------------------------------------
#pragma package(smart_init)
pragma resource "*.dfm
TForm1 *Form1;
AnsiString FileName;
TIcon *Icon = new TIcon();
int TotalIcon;
//----------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
aption="图标小偷 1.0;
utton1->Caption="选择文件;
utton2->Caption="保存图标;
utton3->Caption="保存所有;
utton4->Caption="退出;
Edit1->Text=0;
Edit2->Text=0;
Image1->Width=32;
Image1->Height=32;
penDialog1->Filter="可执行文件(*.exe,*.dll)|*.exe;*.dll|图标文件(*.ico)|*.ico|所有文件(*.*)|*.*;
aveDialog1->Filter="图标文件|*.ico;
ScrollBar1->Enabled=false;
Button2->Enabled=false;
Button3->Enabled=false;
}
//----------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
TotalIcon = (int)ExtractIcon( Form1->Handle, OpenDialog1->FileName.c_str(), -1 );
if(TotalIcon>0)
{
if(TotalIcon<2)
ScrollBar1->Enabled=false;
else
ScrollBar1->Max=TotalIcon-1;
Button2->Enabled=true;
Button3->Enabled=true;
FileName = OpenDialog1->FileName;
Edit1->Text =TotalIcon;
Icon->Handle = ExtractIcon( Form1->Handle, FileName.c_str(), 0);
Image1->Picture->Icon=Icon;
Edit2->Text=1;
}
else
{
howMessage("该文件没有图标);
}
}
}
//----------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(SaveDialog1->Execute())
{
//保存图标
Icon->SaveToFile( SaveDialog1->FileName);
}
}
//----------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(SaveDialog1->Execute())
//提取所有的图标
for(int i=0;i;
{
Icon->Handle = ExtractIcon( Form1->Handle, FileName.c_str(), i);
con->SaveToFile(SaveDialog1->FileName+(AnsiString)i+".ico);
}
}
//----------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Close();
}
//----------------------------------------------------------------
void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
{
Edit2->Text=ScrollBar1->Position+1;
Icon->Handle = ExtractIcon(Form1->Handle, FileName.c_str(),ScrollBar1->Position);
Image1->Picture->Icon=Icon;
}
//----------------------------------------------------------------
标签: