使用C++Builder制作提取图标程序
来源:互联摘选 日期:2004年01月17日 21:50:04
您经常写程序吗?是否为没有好看的图标而发愁?现在,我们用C++Builder(以下简称CB)就可以制作一个从其他程序中提取图标的功能,并可了解非常有用的C++ Builder事件委托使用方法。赶快试一试吧,我已经从C++Builder中提取了6个,从VB中提取了24个图标。下面我们就看一下制作方法:
首先、打开CB,在已生成的窗体文件中加入以下几个控件:Image,OpenDialog,SaveDialog和两个Button按钮,并将Button1的Caption修改为"提取图标",将Button2的Caption修改为"退出"。
然后对代码编辑器的当前单元Unti1.cpp单击右键并选择Open Source/Header File;或按Ctrl+F6打开头文件Unti1.h,在其中的Private:中加入(带下划线的字为写入的代码):
private: // 用户代码
AnsiString TempFile,FileName; file://用于保存的临时文件名和需要提取图标的文件名
TIcon *Icon; file://用来保存正在提取的图标
TImage *img; file://用来显示提取的图标
void SaveImage(TObject *Sender); file://保存提取图标的方法
然后在窗口中双击Button2,在代码中写入:
void __fastcall TForm1::Button2Click(TObject *Sender) file://这是Button2的单击事件
{
Application->Terminate(); file://结束程序
}
双击Button1,在代码中写入:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute()) file://如果打开对话框被执行
{
int Total;
TempFile = "c:\\tmpimg.ico"; file://临时文件名称
Icon = new TIcon(); file://实例化Icon
FileName = OpenDialog1->FileName; file://打开对话框所选择的文件名
HICON hIcon;
Total =(int) ExtractIcon( Form1->Handle, FileName.c_str(), -1);//要提取文件中的图标总数
for (int i=0,x=0,y=0 ;i {
img=new TImage(this);//实例化新的Image控件,用于显求新找到的图标
img->Parent=GroupBox1;//设置父控件
img->OnMouseUp=Image1MouseUp;//当Image控件的OnMouseUp(鼠标按下)事件发生时调用Image!MouseUp方法
if (i%10==0)//如果一行显示了10个图标则重新换行显示,并设置图标显示的位置
{
x=-35;
y= 5*i+10;
}
x=x+40;
img->Top=y;
img->Left=x;
hIcon = ExtractIcon( Form1->Handle, FileName.c_str(), i);//提取图标
Icon->Handle=hIcon;
Icon->SaveToFile(TempFile);//保存
img->Picture->LoadFromFile(TempFile);//装入图标
}
}
}
选中Image1,双击对象浏览器中Events(事件)框中的OnMouseUp事件并写入:
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
{
if (Button==mbRight) SaveImage(Sender);//调用保存图标的方法(非常有用的C++ Builder事件委托方式)
}
在代码编辑拦中加入以下用于保存图标的代码
void TForm1::SaveImage(TObject *Sender)
{
SaveDialog1->FileName="";
if (SaveDialog1->Execute())
{
((TImage*)Sender)->Picture->SaveToFile(SaveDialog1->FileName); file://保存图标
}
此方法中的Sender参数是由上面的Image1MouseUp传递过来的,也就是Image1这个对象。对于整个程序而言,Sender就是那个点击右键的Image对象。也就是说,当你对已经提取出来并显示的图标(既img对象)按鼠标右键时,C++Builder就找到了这个对象,并将它传到了SaveImage方法中。这样SaveImage就知道要保存哪一个图标了。使用此方法简化了保存操作。 当然,您也可以用此Sender来做更多的事!
而((TImage*)Sender)用于将Sender这个TObject转变为TImage对象。此处也可以用C++Builder的强制转变方法进行。
以上程序在windows2000 Professional、C++Builder5上运行通过。
如果您懒得写这个程序,请到我的主页下载wn.126.com,欢迎共同学习。