----在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->