怎样使程序中的API函数LoadImage在VB6集成开发环境下调试运行时也能从资源(.res)文件内加载图标呢?
大家知道,VB的内部函数LoadResPicture总是返回32x32的图标,而有时候我们需要48x48或16x16的图标资源,这时如果我们还用LoadResPictur...
大家知道,VB的内部函数LoadResPicture总是返回32x32的图标,而有时候我们需要48x48或16x16的图标资源,这时如果我们还用LoadResPicture来载入的话是必要对图标进行缩放,这就会造成不必要的图像锯齿和失真。既然我们添加到资源文件中的图标都包含有几套标准尺寸的图标,那么我们完全可以利用API函数LoadImage来加载它们,因为该函数支持以不同标准尺寸来装载图标,从而也就避免了二次缩放图标引起的失真。
但是现在我遇到个问题想请教大家。就是LoadImage函数只能加载已编译程序(.exe)资源中的图标,如果是在VB6集成开发环境下调试运行的话,LoadImage函数会从VB6.EXE中加载资源,这样就会出错找不到我自己的资源。请问,有没有什么方法能够使LoadImage函数在IDE环境下也能从我的工程中的资源(.res)文件内加载图标资源呢?
我在VBGOOD上找到了一种实现方法,具体如以下代码所示:
'从资源中加载图标数据 (ResID,ResType) 到内存 并返回其中规定尺寸 ICONSIZE 的图标句柄
Public Function LoadResIcon(ByVal ResID As String, ByVal ResType As String, Optional ByVal iSize As Long = 16&) As Long
Dim IDETY As ICONDIRENTRY
Dim mIcon() As Byte
Dim i As Long, iLen As Long, pData As Long
iLen = LenB(IDETY)
mIcon = LoadResData(ResID, ResType)
pData = VarPtr(mIcon(0))
For i = 1 To mIcon(4) '第5个字节就是子图标的数目
CopyMemory IDETY, ByVal pData + 6 + (i - 1) * iLen, iLen '读 图标目录 结构数据
If IDETY.bWidth = iSize Then Exit For '寻找符合尺寸的子图标
Next
LoadResIcon = CreateIconFromResourceEx(mIcon(IDETY.dwImageOffset), IDETY.dwBytesInRes, -1, &H30000, iSize, iSize, 0)
End Function
可是我在VB6下调试发现一个问题,就是执行到“CopyMemory IDETY, ByVal pData + 6 + (i - 1) * iLen, iLen”时就不往下执行了,我觉得是计算内存地址有问题,但又不知道怎样修改,麻烦帮修改下吧 展开
但是现在我遇到个问题想请教大家。就是LoadImage函数只能加载已编译程序(.exe)资源中的图标,如果是在VB6集成开发环境下调试运行的话,LoadImage函数会从VB6.EXE中加载资源,这样就会出错找不到我自己的资源。请问,有没有什么方法能够使LoadImage函数在IDE环境下也能从我的工程中的资源(.res)文件内加载图标资源呢?
我在VBGOOD上找到了一种实现方法,具体如以下代码所示:
'从资源中加载图标数据 (ResID,ResType) 到内存 并返回其中规定尺寸 ICONSIZE 的图标句柄
Public Function LoadResIcon(ByVal ResID As String, ByVal ResType As String, Optional ByVal iSize As Long = 16&) As Long
Dim IDETY As ICONDIRENTRY
Dim mIcon() As Byte
Dim i As Long, iLen As Long, pData As Long
iLen = LenB(IDETY)
mIcon = LoadResData(ResID, ResType)
pData = VarPtr(mIcon(0))
For i = 1 To mIcon(4) '第5个字节就是子图标的数目
CopyMemory IDETY, ByVal pData + 6 + (i - 1) * iLen, iLen '读 图标目录 结构数据
If IDETY.bWidth = iSize Then Exit For '寻找符合尺寸的子图标
Next
LoadResIcon = CreateIconFromResourceEx(mIcon(IDETY.dwImageOffset), IDETY.dwBytesInRes, -1, &H30000, iSize, iSize, 0)
End Function
可是我在VB6下调试发现一个问题,就是执行到“CopyMemory IDETY, ByVal pData + 6 + (i - 1) * iLen, iLen”时就不往下执行了,我觉得是计算内存地址有问题,但又不知道怎样修改,麻烦帮修改下吧 展开
2个回答
展开全部
Private Declare Function LoadImage1 Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As Long, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
Private Function IsIDE() As Boolean
On Error GoTo Err
Debug.Print 1 \ 0
Exit Function
Err:
IsIDE = True
End Function
Private Sub Form_Load()
If IsIDE Then
hIcon = LoadImage(App.hInstance, "z:\48.ico", 1, 0&, 0&, &H10)
Else
hIcon = LoadImage1(App.hInstance, 101, 1, 0&, 0&, &H0)
End If
MsgBox hIcon
End Sub
或者你自己写个解析res资源文件格式(win32 resource file format ) 从中提取图标 这也应该是Loadrespicture做的事
Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
Private Function IsIDE() As Boolean
On Error GoTo Err
Debug.Print 1 \ 0
Exit Function
Err:
IsIDE = True
End Function
Private Sub Form_Load()
If IsIDE Then
hIcon = LoadImage(App.hInstance, "z:\48.ico", 1, 0&, 0&, &H10)
Else
hIcon = LoadImage1(App.hInstance, 101, 1, 0&, 0&, &H0)
End If
MsgBox hIcon
End Sub
或者你自己写个解析res资源文件格式(win32 resource file format ) 从中提取图标 这也应该是Loadrespicture做的事
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询