大家知道,VB的内部函数LoadResPicture总是返回32x32的图标,而有时候我们需要48x48或16x16的图标资源,这时如果我们还用LoadResPicture来载入的话是必要对图标进行缩放,这就会造成不必要的图像锯齿和失真。既然我们添加到资源文件中的图标都包含有几套标准尺寸的图标,那么我们完全可以利用API函数LoadImage来加载它们,因为该函数支持以不同标准尺寸来装载图标,从而也就避免了二次缩放图标引起的失真。
 
但是现在我遇到个问题想请教大家。就是LoadImage函数只能加载已编译程序(.exe)资源中的图标,如果是在VB6集成开发环境下调试运行的话,LoadImage函数会从VB6.EXE中加载资源,这样就会出错找不到我自己的资源。请问,有没有什么方法能够使LoadImage函数在IDE环境下也能从我的工程中的资源(.res)文件内加载图标资源呢?

解决方案 »

  1.   

    有没有考虑过把48x48或16x16的图标按自定义资源添加进去试试?我也没试过,但是添加过DOC和EXCEL,没有遇到信息丢失
      

  2.   

     
    可如果将图标以自定义资源添加进去的话就必须用LoadResData装载,但该函数返回的是字节数组,怎样才能把它直接转换成StdPicture对象呢?总不能把图标的字节数据写到一个磁盘文件里再加载进来吧~~~
      

  3.   

    imagelist控件?名字可能有误。
      

  4.   

    imagelist控件我以前试过,有些高清晰的ICO文件直接不认,出错
      

  5.   

    LoadImage可以读取资源文件?
    怎么读?
      

  6.   

    我想LoadImage是无法读取资源(.res)文件的,就算是FindResource和LoadResource恐怕也不能,它们只能读取已编译到EXE中的资源。那么我想再问一下有没有其它API函数可以实现读取资源(.res)文件呢?显然VB的内部函数LoadResPicture就能实现在IDE环境下直接读取资源(.res)文件。不知道他是怎么实现的
      

  7.   

    我在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 i
        LoadResIcon = CreateIconFromResourceEx(mIcon(IDETY.dwImageOffset), IDETY.dwBytesInRes, -1, &H30000, iSize, iSize, 0)
    End Function可是我在VB6下运行调试时发现一个问题,就是程序执行到“CopyMemory IDETY, ByVal pData + 6 + (i - 1) * iLen, iLen”这一行时就不再往下执行了,我觉得是计算的内存地址有问题,但又不知道怎样修改,麻烦大家抽空儿帮我修改一下吧
      

  8.   

    CopyMemory IDETY, mIcon(6 + (i - 1) * iLen), iLen
      

  9.   

    感谢老鸟兄啦,经你这么一修改可以了!_(o ^ _ ^ o)> 其实之前我也找到问题出在哪里了,原来是因为ICONDIRENTRY这个结构类型中的变量顺序定义错了,我是从FoxAPI浏览器里查找复制的,没想到顺序竟然会有错!后来我又查阅了相关资料,才知道正确的定义顺序如下所示:Private Type icondirentry
         bwidth   As Byte ';byte     // width, in pixels, of the image:图像宽度,以象素为单位。一个字节
         bheight   As Byte ';byte    // height, in pixels, of the image:图像高度,以象素为单位。一个字节
         bcolorcount   As Byte ';byte   // number of colors in image (0 if >=8bpp):图像中的颜色数(如果是>=8bpp的位图则为0)
         breserved   As Byte ';byte     // reserved ( must be 0):保留字必须是0
         wplanes   As Integer ';word    // color planes:为目标设备说明位面数,其值将总是被设为1
         wbitcount   As Integer ';word    // bits per pixel:每象素所占位数。
         dwbytesinres   As Long   ';dword    // how many bytes in this resource?:这份资源所占字节数
         dwimageoffset   As Long ';dword    // where in the file is this image?:图像数据(iconimage)起点偏移位置。
    End Type ' icondirentry好了,现在终于解决问题了,这里我还找到一篇《VB6中使用32位图标(第二版)》的好文章,其中详细说明了ICONDIRENTRY和CreateIconFromResourceEx的运用 http://blog.csdn.net/modest/archive/2008/05/22/2468937.aspx