VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB编程获取文件中集成的图标
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:9877, 日期:2001-06-26
VB编程获取文件中集成的图标
---- 在Win95 下 的 应 用 软 件 使 用 了 打 量 精 美 的 图 标, 而 很 多 图 标 资 源 是 集 成 在EXE、DLL 文 件 中 的( 例 如Win95 的 回 收 站 就 使 用 了Shell32.dll 中 的 图 标,31 号 图 标 表 示 回 收 站 空,32 号 表 示 回 收 站 有 被 删 除 文 件) 在 我 们 编 程 中, 可 以 利 用Win95 的API 函 数ExtractIcon 可 以 将EXE、DLL 文 件 中 的 图 标 资 源 取 出, 下 面 通 过 一 个VB 的 例 子 通 过 使 用 该 函 数 将 文 件 中 包 含 的 图 标 取 出 并 且 在 一 个 图 片 框 内 浏 览。

---- 1、 在Form1 的General 的Declarations 中 定 义 以 下 两 个 函 数:

Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long,ByVal lpszExeFileName As String,ByVal nIconIndex As Long) As Long
ExtractIcon函数包含三个参量:
hInst表示当前的程序实例
lpszExeFileName表示包含图标的资源文件名
nIconIndex表示要取出的图标的序号

---- 如 果nIconIndex 为-1, 则 函 数 返 回 包 含 图 标 资 源 的 文 件 的 图 标 个 数.

---- 从 文 件 中 取 出 图 标 资 源 前, 应 首 先 调 用 该 函 数 获 得 文 件 中 包 含 的 图 标 资 源 的 个 数.

---- 如nIconIndex 为 图 标 资 源 的 序 号, 则 返 回 图 标 句 柄.

Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
DrawIcon函数将图标画到一个图形设备上,
hdc为图形设备句柄,x,y为起始位置,
hIcon为图标句柄。

---- 定 义 三 个 全 局 变 量:

Dim lNum As Long 注释:图标的序号
Dim lCount As Long 注释:文件中包含的图标的总数
Dim astr As String 注释:包含图标的文件名

---- 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、 全 部 源 程 序 如 下:

Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As 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
Dim lNum As Long
Dim lCount As Long
Dim astr As String

Private Sub CNext_Click() 注释:浏览下一个图标
lNum = lNum + 1
x1 = ExtractIcon(App.hInstance, astr, lNum)
Form1.Refresh
x2 = DrawIcon(Form1.hdc, 10, 10, x1)
CPrv.Enabled = True
If lNum = lCount Then
CNext.Enabled = False
End If
End Sub

Private Sub COpen_Click() 注释:打开文件
Dim x1 As Long
Dim x2 As Long

CommonDialog1.ShowOpen
lCount = ExtractIcon(App.hInstance, CommonDialog1.filename, -1)
If lCount > 0 Then
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("File Contain no icon resource.")
CPrv.Enabled = False: CNext.Enabled = False
End If
End Sub

Private Sub CPrv_Click() 注释:浏览前一个图标
lNum = lNum - 1
x1 = ExtractIcon(App.hInstance, astr, lNum)
Form1.Refresh
x2 = DrawIcon(Form1.hdc, 10, 10, x1)
CNext.Enabled = True
If lNum = 0 Then
CPrv.Enabled = False
End If
End Sub