ExtractIcon VB声明
Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
说明
判断一个可执行文件或DLL中是否有图标存在,并将其提取出来
返回值
Long,如成功,返回指向图标的句柄;如文件中不存在图标,则返回零。如果nIconIndex设为-1,就返回文件中的图标总数
参数表
参数 类型及说明
hInst Long,当前应用程序的实例句柄。也可用GetWindowWord函数取得拥有一个窗体或控件的实例的句柄
lpszExeFileName String,在其中提取图标的那个程序的全名
nIconIndex Long,欲获取的图标的索引。如果为-1,表示取得文件中的图标总数 DrawIcon VB声明
Declare Function DrawIcon Lib "user32" Alias "DrawIcon" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
说明
在指定的位置画一个图标
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hdc Long,设备场景
x,y Long,想描绘图标的位置(逻辑坐标)
hIcon Long,欲描绘图标的句柄
Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
说明
判断一个可执行文件或DLL中是否有图标存在,并将其提取出来
返回值
Long,如成功,返回指向图标的句柄;如文件中不存在图标,则返回零。如果nIconIndex设为-1,就返回文件中的图标总数
参数表
参数 类型及说明
hInst Long,当前应用程序的实例句柄。也可用GetWindowWord函数取得拥有一个窗体或控件的实例的句柄
lpszExeFileName String,在其中提取图标的那个程序的全名
nIconIndex Long,欲获取的图标的索引。如果为-1,表示取得文件中的图标总数 DrawIcon VB声明
Declare Function DrawIcon Lib "user32" Alias "DrawIcon" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
说明
在指定的位置画一个图标
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hdc Long,设备场景
x,y Long,想描绘图标的位置(逻辑坐标)
hIcon Long,欲描绘图标的句柄
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As LongPrivate Sub Command1_Click()
Dim icon As Long
icon = ExtractIcon(App.hInstance, "c:\winamp.exe", 1)
DrawIcon Picture1.hdc, 0, 0, icon
Picture1.Refresh
End SubPrivate Sub Form_Load()
Picture1.AutoRedraw = True
End Sub注意:你若想得到所有的图标,你可以把
num = ExtractIcon(App.hInstance, "c:\winamp.exe", -1)
你就可以得到图标的数目
然后,呵呵不用说了吧
用for i=0 to num
icon=ExtractIcon(App.hInstance, "c:\winamp.exe", i)
DrawIcon Picture1.hdc, 32*i, 0, icon
Picture1.Refresh
next
DrawIconEx VB声明
Declare Function DrawIconEx Lib "user32" Alias "DrawIconEx" (ByVal hdc As Long, ByVal xLeft As Long, ByVal yTop As Long, ByVal hIcon As Long, ByVal cxWidth As Long, ByVal cyWidth As Long, ByVal istepIfAniCur As Long, ByVal hbrFlickerFreeDraw As Long, ByVal diFlags As Long) As Long
说明
描绘一个图标或鼠标指针。与DrawIcon相比,这个函数提供了更多的功能
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hdc Long,要在其中画图的一个设备场景的句柄
xLeft,yTop Long,图标左上角的位置,用逻辑坐标表示
hIcon Long,要描绘的图标的句柄
cxWidth,cyWidth Long,希望的图标宽度和高度。图标会自动缩放,与指定的值相符
istepIfAniCur Long,如果hIcon是个动画指针,那么该参数指定描绘动画中的哪幅图象。注意Win32不能区分图标和指针
hbrFlickerFreeDraw Long,如设为一个刷子句柄,那么函数会将图标画入一幅内存位图,并用背景色填充。随后,将图象直接复制到指定的位置。这样做可绘图时减少闪烁(因为画图过程中重现)
diFlags Long,下述常数之一:
DI_COMPAT 描绘标准的系统指针,而不是指定的图象
DI_DEFAULTSIZE 忽略cxWidth和cyWidth设置,并采用原始的图标大小
DI_IMAGE 绘图时使用图标的XOR部分(即图标没有透明区域)
DI_MASK 绘图时使用图标的MASK部分(如单独使用,可获得图标的掩模)
DI_NORMAL 用常规方式绘图(合并 DI_IMAGE 和 DI_MASK)
注解
应检查Windows95是否与指定的标志及参数兼容。Win32用户手册宣称函数与Windows 95是兼容的,但在实际运用中发现它有一定的限制
Size As Long
tType As Long
hBmp As Long
hPal As Long
Reserved As Long
End Type
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, _
ByVal fPictureOwnsHandle As Long, IPic As IPicture) As LongPrivate Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" (ByVal lpszFile As String, ByVal _
nIconIndex As Long, phiconLarge As Long, phiconSmall As Long, ByVal nIcons As Long) As LongPrivate Declare Function DestroyIcon Lib "user32" (ByVal hicon As Long) As LongPublic Function GetIconFromFile(FileName As String, IconIndex As Long, UseLargeIcon As Boolean) As Picture'参数:
'FileName - 包含有图标的文件 (EXE or DLL)
'IconIndex - 欲提取的圉标的索引,从零开始
'UseLargeIcon-如设置为True,则提取大图标,否则提取小图标
'返回值: 包含标标的Picture对象Dim hlargeicon As Long
Dim hsmallicon As Long
Dim selhandle As Long' IPicture requires a reference to "Standard OLE Types."
Dim pic As PicBmp
Dim IPic As IPicture
Dim IID_IDispatch As GUIDIf ExtractIconEx(FileName, IconIndex, hlargeicon, hsmallicon, 1) > 0 ThenIf UseLargeIcon Then
selhandle = hlargeicon
Else
selhandle = hsmallicon
End If' Fill in with IDispatch Interface ID.
With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
' Fill Pic with necessary parts.
With pic
.Size = Len(pic) ' Length of structure.
.tType = vbPicTypeIcon ' Type of Picture (bitmap).
.hBmp = selhandle ' Handle to bitmap.
End With' Create Picture object.
Call OleCreatePictureIndirect(pic, IID_IDispatch, 1, IPic)' Return the new Picture object.
Set GetIconFromFile = IPicDestroyIcon hsmallicon
DestroyIcon hlargeiconEnd If
End Function
在窗体中添加一个PictureBox控件和一个命令按钮,把下面的代码加入到命令按钮的Click事件中:Set Picture1.Picture = GetIconFromFile("c:\windows\moricons.dll", _ 0, True)按F5运行程序,点击命令按钮后,PictureBox会将文件moricons.dll中的图标索引为零的图标画到PictureBox中。