api技巧集(四)

浏览:45日期:2023-02-03
提取图标; 调用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:WINDOWSSYSTEMSHELL32.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; } //----------------------------------------------------------------
相关文章: