用C++ Builder取得應(yīng)用程序圖標(biāo)
發(fā)表時間:2023-08-01 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]文/王斌 我們經(jīng)常在網(wǎng)上看到有關(guān)提取圖標(biāo)的共享軟件或免費(fèi)軟件。喜歡編程的朋友們都在夢想自己能夠動手做一個!使用可視化編程利器C++Builder可使你制作這樣的軟件變得非常輕松。 建立工程文件 ...
文/王斌
我們經(jīng)常在網(wǎng)上看到有關(guān)提取圖標(biāo)的共享軟件或免費(fèi)軟件。喜歡編程的朋友們都在夢想自己能夠動手做一個!使用可視化編程利器C++Builder可使你制作這樣的軟件變得非常輕松。
建立工程文件
首先啟動C++Builder,新建一工程,在窗體上放置兩個控件:“抽取”按鈕SpeedButton1、“退出”按鈕SpeedButton2。設(shè)一個ListView控件用來瀏覽抽取的圖表信息、一個Image控件用來顯示當(dāng)前的圖標(biāo)信息和一個OpenDialog控件用來打開被選文件,它們的名稱均不必改動。為了美觀,讀者還可以根據(jù)需要增加其它控件,做適當(dāng)?shù)臐櫳?br>
取得和顯示圖標(biāo)
雙擊SpeedButton控件,在Click事件中寫如下代碼:
void_fastcall TForm1::SpeedButton1Click(TObject
Sender)
{
TListItemLst;
if(OpenDialog1->Execute())
//打開被提取圖標(biāo)的文件
{
FileName=OpenDialog1->FileName;
FileName=FileName.UpperCase();
TempFile=FileName.SubString(1,FileName.AnsiPos("."))+"ICO";
//產(chǎn)生和備選文件同名的Ico圖標(biāo)文件名
HICON hIcon; //定義抽取的圖標(biāo)句柄
int Total =(int) ExtractIcon( Form1->Handle, FileName.c_str(), -1);
//抽取圖標(biāo):-1表示抽取所有圖標(biāo)并且將獲得的圖標(biāo)總數(shù)存入變量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)+"號圖標(biāo)";
Lst->ImageIndex=i;
}
if(Total>0)
{
Icon->SaveToFile(TempFile);
//將最后一個圖標(biāo)存入文件
Image1->Picture->LoadFromFile(TempFile); //將存入文件的圖標(biāo)顯示
}
}
}
以下為退出按鈕設(shè)置
void_fastcall TForm1::SpeedButton2Click(TObjectSender)
{
Close();
}
在編輯文檔的頭文件中定義:AnsiString TempFile,FileName;TiconIcon;運(yùn)行程序時,你所選定的程序的全部圖標(biāo)就在ListView控件中顯示出來,最后一個圖標(biāo)在Image控件中顯示出來,此時如果在ListView中單擊圖標(biāo),相應(yīng)的信息也將在Image控件中顯示。
經(jīng)過以上的操作,被選文件的圖標(biāo)信息就被顯示出來了。下面,我們討論如何存儲被選定的圖標(biāo)。
存儲圖標(biāo)
為了不影響整個界面的美觀,我們在Form上建立一個快捷選單,并在“存儲圖標(biāo)”的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下的執(zhí)行文件,大部分都是資源信息與應(yīng)用代碼單獨(dú)存放的,從這些資源文件中抽取圖標(biāo)信息只是很小的一個實(shí)例。如果要獲取更多的信息,就需要調(diào)用API函數(shù)SHGetFileInfo。有興趣的朋友可以用本文類似的思路進(jìn)行更深一步的探討,我想,編寫一個漢化軟件并非難事。