----在Win95下的应用软件使用了打量精美的图标,而很多图标资源是集成在EXE、DLL文件中的(例如Win95的回收站就使用了Shell32.dll中的图标,31号图标表示回收站空,32号表示回收站有被删除文件)在我们编程中,可以利用Win95的API函数ExtractIcon可以将EXE、DLL文件中的图标资源取出,下面通过一个VB的例子通过使用该函数将文件中包含的图标取出并且在一个图片框内浏览。
----1、在Form1的General的Declarations中定义以下两个函数:
PrivateDeclareFunctionExtractIconLib"shell32.dll"Alias"ExtractIconA"(ByValhInstAsLong,ByVallpszExeFileNameAsString,ByValnIconIndexAsLong)AsLong ExtractIcon函数包含三个参量: hInst表示当前的程序实例 lpszExeFileName表示包含图标的资源文件名 nIconIndex表示要取出的图标的序号
----如果nIconIndex为-1,则函数返回包含图标资源的文件的图标个数.
----从文件中取出图标资源前,应首先调用该函数获得文件中包含的图标资源的个数.
----如nIconIndex为图标资源的序号,则返回图标句柄.
PrivateDeclareFunctionDrawIconLib"user32"(ByValhdcAsLong,ByValxAsLong,ByValyAsLong,ByValhIconAsLong)AsLong DrawIcon函数将图标画到一个图形设备上, hdc为图形设备句柄,x,y为起始位置, hIcon为图标句柄。
----定义三个全局变量:
DimlNumAsLong'图标的序号 DimlCountAsLong'文件中包含的图标的总数 DimastrAsString'包含图标的文件名
----2、在Form1中添加以下控件:
a、CommandButton,Name属性设置为COpen b、CommandButton,Name属性设置为 CPrv,Enabled属性设置为False c、CommandButton,Name属性设置为 CNext,Enabled属性设置为False d、CommonDialog,Name属性设置为 CommonDialog1,Filter属性设置为"可执行文件(*.exe)| *.exe|动态链接库(*.dll)|*.dll|所有文件(*.*)|*.*"
----3、全部源程序如下:
PrivateDeclareFunctionExtractIconLib"shell32.dll"Alias"ExtractIconA"(ByValhInstAsLong,ByVallpszExeFileNameAsString,ByValnIconIndexAsLong)AsLong PrivateDeclareFunctionDrawIconLib"user32"(ByValhdcAsLong,ByValxAsLong,ByValyAsLong,ByValhIconAsLong)AsLong DimlNumAsLong DimlCountAsLong DimastrAsString
PrivateSubCNext_Click()'浏览下一个图标 lNum=lNum 1 x1=ExtractIcon(App.hInstance,astr,lNum) Form1.Refresh x2=DrawIcon(Form1.hdc,10,10,x1) CPrv.Enabled=True IflNum=lCountThen CNext.Enabled=False EndIf EndSub
PrivateSubCOpen_Click()'打开文件 Dimx1AsLong Dimx2AsLong
CommonDialog1.ShowOpen lCount=ExtractIcon(App.hInstance,CommonDialog1.filename,-1) IflCount>0Then astr=CommonDialog1.filename lNum=0 Form1.Caption=astr CPrv.Enabled=False:CNext.Enabled=True x1=ExtractIcon(App.hInstance,astr,lNum) Form1.Refresh x2=DrawIcon(Form1.hdc,10,10,x1) Else x1=MsgBox("FileContainnoiconresource.") CPrv.Enabled=False:CNext.Enabled=False EndIf EndSub
PrivateSubCPrv_Click()'浏览前一个图标 lNum=lNum-1 x1=ExtractIcon(App.hInstance,astr,lNum) Form1.Refresh x2=DrawIcon(Form1.hdc,10,10,x1) CNext.Enabled=True IflNum=0Then CPrv.Enabled=False EndIf EndSub->
|