文/王斌
我们经常在网上看到有关提取图标的共享软件或免费软件。喜欢编程的朋友们都在梦想自己能够动手做一个!使用可视化编程利器C++Builder可使你制作这样的软件变得非常轻松。
建立工程文件
首先启动C++Builder,新建一工程,在窗体上放置两个控件:“抽取”按钮SpeedButton1、“退出”按钮SpeedButton2。设一个ListView控件用来浏览抽取的图表信息、一个Image控件用来显示当前的图标信息和一个OpenDialog控件用来打开被选文件,它们的名称均不必改动。为了美观,读者还可以根据需要增加其它控件,做适当的润色。
取得和显示图标
双击SpeedButton控件,在Click事件中写如下代码:
void_fastcall TForm1::SpeedButton1Click(TObject
Sender)
{
TListItemLst;
if(OpenDialog1->Execute())
//打开被提取图标的文件
{
FileName=OpenDialog1->FileName;
FileName=FileName.UpperCase();
TempFile=FileName.SubString(1,FileName.AnsiPos("."))+"ICO";
//产生和备选文件同名的Ico图标文件名
HICON hIcon; //定义抽取的图标句柄
int Total =(int) ExtractIcon( Form1->Handle, FileName.c_str(), -1);
//抽取图标:-1表示抽取所有图标并且将获得的图标总数存入变量Total
ListView1->Items->Clear();
ImageList1->Clear();
for(int i=0;i {
Icon = new TIcon();
hIcon = ExtractIcon( Form1->Handle, FileName.c_str(),i);
Icon->Handle=hIcon;
ImageList1->AddIcon(Icon);
Lst=ListView1->Items->Add();
Lst->Caption="第"+IntToStr(i)+"号图标";
Lst->ImageIndex=i;
}
if(Total>0)
{
Icon->SaveToFile(TempFile);
//将最后一个图标存入文件
Image1->Picture->LoadFromFile(TempFile); //将存入文件的图标显示
}
}
}
以下为退出按钮设置
void_fastcall TForm1::SpeedButton2Click(TObjectSender)
{
Close();
}
在编辑文档的头文件中定义:AnsiString TempFile,FileName;TiconIcon;运行程序时,你所选定的程序的全部图标就在ListView控件中显示出来,最后一个图标在Image控件中显示出来,此时如果在ListView中单击图标,相应的信息也将在Image控件中显示。
经过以上的操作,被选文件的图标信息就被显示出来了。下面,我们讨论如何存储被选定的图标。
存储图标
为了不影响整个界面的美观,我们在Form上建立一个快捷选单,并在“存储图标”的Click事件中书写如下代码:
void_fastcall TForm1::N1Click(TObjectSender)
{
if (InputQuery("提示信息", "存储文件名:", PutFile)) //弹出输入对话框
{
if (PutFile.Length()>0)
{
if(PutFile.AnsiPos(".")<=0)
{
PutFile=PutFile+".Ico" ;
}
if(ListView1->Selected!=NULL)
{
HICON hIcon;
Icon = new TIcon();
hIcon=ExtractIcon(Form1->Handle,FileName.c_str(),ListView1->Selected->Index);
Icon->Handle=hIcon;
Icon->SaveToFile(PutFile);
Image1->Picture->LoadFromFile(PutFile);
delete Icon;
}
}
}
}
Windows下的执行文件,大部分都是资源信息与应用代码单独存放的,从这些资源文件中抽取图标信息只是很小的一个实例。如果要获取更多的信息,就需要调用API函数SHGetFileInfo。有兴趣的朋友可以用本文类似的思路进行更深一步的探讨,我想,编写一个汉化软件并非难事。
|