网站首页/技术开发列表/内容

用C++ Builder取得应用程序图标

技术开发2022-05-05阅读
文/王斌

  我们经常在网上看到有关提取图标的共享软件或免费软件。喜欢编程的朋友们都在梦想自己能够动手做一个!使用可视化编程利器C++Builder可使你制作这样的软件变得非常轻松。

  建立工程文件

  
  首先启动C++Builder,新建一工程,在窗体上放置两个控件:“抽取”按钮SpeedButton1、“退出”按钮SpeedButton2。设一个ListView控件用来浏览抽取的图表信息、一个Image控件用来显示当前的图标信息和一个OpenDialog控件用来打开被选文件,它们的名称均不必改动。为了美观,读者还可以根据需要增加其它控件,做适当的润色。

  取得和显示图标

  双击SpeedButton控件,在Click事件中写如下代码:

   void_fastcall TForm1::SpeedButton1Click(TObject

  Sender)

  {

   TListItemLst;

   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(TObjectSender)

  {

   Close();

  }

  在编辑文档的头文件中定义:AnsiString TempFile,FileName;TiconIcon;运行程序时,你所选定的程序的全部图标就在ListView控件中显示出来,最后一个图标在Image控件中显示出来,此时如果在ListView中单击图标,相应的信息也将在Image控件中显示。

  经过以上的操作,被选文件的图标信息就被显示出来了。下面,我们讨论如何存储被选定的图标。

  存储图标

  为了不影响整个界面的美观,我们在Form上建立一个快捷选单,并在“存储图标”的Click事件中书写如下代码:

  void_fastcall TForm1::N1Click(TObjectSender)

  {

   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。有兴趣的朋友可以用本文类似的思路进行更深一步的探讨,我想,编写一个汉化软件并非难事。

……

相关阅读