hIcon是指向图标的句柄,而句柄本身又是一个指向指针的指针,实际上如果我能通过hIcon获得图标在内存中的数据块,我想就可以实现我的目的,但如何通过一个句柄来获得内存中的数据呢?这个我搞不懂。另外,我也想过其它方法,比如用GetIconInfo获得图标的hbmpMask和hbmpColor,再用GetDibits获得这两个位图的bits,加上图标的文件头也可以生成图标文件的数据,但无论图标是16色、256色还是真彩,hbmpColor返回的位图数据都变成32位色了,这时得到的位图bits也不对,而且对16色、256色图标,如何获得它的调色板呢?把hIcon转换成Picture再保存,VB的SavePicture似乎只能保存16色位图,保存256色以上的图标的结果就是颜色数不对,这个方法也不行。头痛死了,这个问题困扰我好长时间,各位来帮我想想办法。

解决方案 »

  1.   

    了解 ico 的格式,到内存中直接读出来
      

  2.   

    这里有一个例子:
    http://vbaccelerator.com/codelib/gfx/iconread.htm
    源码:
    http://vbaccelerator.com/codelib/gfx/cfileico.zip
      

  3.   

    将文件中集成的图标资源提取并且保存起来:
    http://www.applevb.com/sourcecode/icond.zip
      

  4.   

    贴错了,这个代码:http://www.applevb.com/sourcecode/exticontree.zip从DLL、EXE文件中读取图标ID并保存到文件的方法。
      

  5.   

    确实是那样的。很久以前写的提取图标保存,存下来的都是一个摸样。不过在当时,对自己要求很低。能写出来就高呼万岁,那些东西根本没在意。研究研究去。
    把hIcon指向的内存地址的数据用数组读入,然后写出成ICO行不行?
      

  6.   

    要想操作ICO文件首先得对bmp了解,ico实际上就是一个bmp文件加上ico文件头,然后再加上后的图像(2色,黑与白)的bmp
      

  7.   

    了解 ico 的格式,到内存中直接读出来
    --------------------------------------
    等于没说,我就是想把数据从内存中读出来,怎么读?
    这里有一个例子:
    http://vbaccelerator.com/codelib/gfx/iconread.htm
    源码:
    http://vbaccelerator.com/codelib/gfx/cfileico.zip
    ---------------------------------------------------贴错了,这个代码:http://www.applevb.com/sourcecode/exticontree.zip从DLL、EXE文件中读取图标ID并保存到文件的方法。
    ---------------------------------------------------
    谢谢,从文件中读取图标我自己也写出来了,我需要从hIcon中获得图标数据。比如说我获得一个系统图标的hicon,要把这个hicon直接保存为ico文件。
    把hIcon指向的内存地址的数据用数组读入,然后写出成ICO行不行?
    -----------------------------------------------------------
      

  8.   

    实际上微软的MSDN已经给了我们一个很好的exe,dll提取ico的工具(附源程序)
      

  9.   

    按错键,没写完就提交了。
    把hIcon指向的内存地址的数据用数组读入,然后写出成ICO行不行?
    -----------------------------------------------------------
    我就是想做到这点,但hicon是句柄,它并不是直接指向内存数据的指针,其实我的问题也可以归纳为:如何通过句柄获得内存数据。我的问题可能比较怪,一个EXE文件,可以用loadlibary,loadresource这些API函数来获得其中包含的图标,也可以用shgetfileinfo来获得这个EXE文件的显示图标的hicon,前者没问题,后者把hicon显示到界面上也没问题,但现在我需要把后者保存为图标。
      

  10.   

    要想操作ICO文件首先得对bmp了解,ico实际上就是一个bmp文件加上ico文件头,然后再加上后的图像(2色,黑与白)的bmp
    ----------------------------------------------------------------
    ico文件格式我了解
      

  11.   

    picturebox也可以直接保存ico文件呀,你参考一下这个:
    http://www.china-askpro.com/msg7/qa48.shtml
      

  12.   

    http://www.vbaccelerator.com/home/VB/Code/Libraries/Graphics_and_GDI/Reading_and_Saving_ICO_Files_in_VB/cFileIcon_Class_and_Demonstration_Project.zip
      

  13.   

    picturebox也可以直接保存ico文件呀,你参考一下这个:
    http://www.china-askpro.com/msg7/qa48.shtml
    ---------------------------------------------------
    savepicture直能保存16色图标。http://www.vbaccelerator.com/home/VB/Code/Libraries/Graphics_and_GDI/Reading_and_Saving_ICO_Files_in_VB/cFileIcon_Class_and_Demonstration_Project.zip
    -------------------------------------------------------------------
    上面有人贴出来了,我看过,是从EXE、DLL文件中提取图标,这个我已经完成了。我是想直接通过hIcon保存为图标。可能我表达的不清楚,我不是要从文件中提取图标。这样说吧,我们知道windows本身有个系统图标集,用SHGetFileInfo ,将uFlag参数设为SHGFI_SYSICONINDEX 就可以获得这个图标集的himl,从而获得系统图标的hIcon,怎样把这个hIcon保存为图标文件?
    觉得我还没说清楚的话,看看我的代码:Private Sub Command1_Click()
        Dim himl            As Long
        Dim hIcon           As Long
        Dim hPic            As IPictureDisp
        Dim lngCount        As Long
        Dim lngX            As Long
        
        himl = GetSysILHandle(0)     '获得系统大图标集的句柄
        hIcon = ImageList_GetIcon(himl, 1, 0)    '获得系统图标集中索引为1的图标句柄
        Set hPic = IconToPicture(hIcon)          '将图标句柄转换成Picture
        SavePicture "d:\1.ico",hPic
    End Sub在上面的代码中,如果图标是16色的,用SavePicture保存没有问题,超过16色的,则SavePicture也只保存为16色图标,这显然不行。再看这段代码:
    Dim hIcon       As Long
    Dim tif         As ICONINFO
    Dim tBMP        As BITMAPCall GetIconInfo(hIcon,tif)            '获得图标信息,GetIconInfo是API函数
    MyGetObject tif.hbmColor, Len(tBMP), tBMP  'MyGetObject是API函数 GetObject这里我本来想获得图标的彩色位图部分和黑白位图部分的bits,然后加上图标的文件头,就可以生成图标文件,但事与愿违,无论图标是多少色的,tBMP.bmBitsPixel 都是32,也就是32位色的位图,根本就不对,我不知道错在哪里。而且对256色以下的图标,还需要获得调色板,我也不知道怎么得到。所以这个方法也失败了。再说明一下,ICO文件格式我非常清楚,从文件中提取图标的方法我也完全清楚,我要的是直接将hIcon保存为图标文件。
      

  14.   

    看看http://www.moon-soft.com/doc/readelite608749.htm里对调色板处理的代码是否对你有帮助
      

  15.   

    还是自己解决了。不过美中不足的是,无论多少色的图标,最后都是保存为真彩色,而不能保存为hIcon本来的格式。多谢论坛里热心的朋友。困扰多日的问题搞定,痛快,再开个贴子散分。