电脑技术学习

api技巧集(四)

dn001
提取图标;


  调用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;

}
//----------------------------------------------------------------

标签: