下面给出一个完整的图标提取程序源码。
这个程序需要四个按钮控件(Button)、四个文本标签控件(Label)、两个文本框控件(Edit)、一个水平滚动条控件(ScrollBar)、一个打开文件对话框控件(OpenDialog)、一个保存文件对话框控件(SaveDialog)和一个图片控件(Image),还有一个Panel控件是装饰用的。界面如图所示:
把各个控件排列好,再把四个Label控件的Caption属性修改一个,最后输入程序代码,运行程序,一个提取图标的程序就出来了,你以后也就不会为没有图标资源可用而发愁了。
程序清单(Unit1.cpp):
//----------------------------------------------------------------
#include <vcl.h>
#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)
{
Caption="图标小偷 1.0";
Button1->Caption="选择文件";
Button2->Caption="保存图标";
Button3->Caption="保存所有";
Button4->Caption="退出";
Edit1->Text=0;
Edit2->Text=0;
Image1->Width=32;
Image1->Height=32;
OpenDialog1->Filter="可执行文件(*.exe,*.dll)|*.exe;*.dll|图标文件(*.ico)|*.ico|所有文件(*.*)|*.*";
SaveDialog1->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
{
ShowMessage("该文件没有图标");
}
}
}
//----------------------------------------------------------------
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<TotalIcon-1;i++)
{
Icon->Handle = ExtractIcon( Form1->Handle, FileName.c_str(), i);
Icon->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;
}
//----------------------------------------------------------------