hIcon是指向图标的句柄,而句柄本身又是一个指向指针的指针,实际上如果我能通过hIcon获得图标在内存中的数据块,我想就可以实现我的目的,但如何通过一个句柄来获得内存中的数据呢?这个我搞不懂。另外,我也想过其它方法,比如用GetIconInfo获得图标的hbmpMask和hbmpColor,再用GetDibits获得这两个位图的bits,加上图标的文件头也可以生成图标文件的数据,但无论图标是16色、256色还是真彩,hbmpColor返回的位图数据都变成32位色了,这时得到的位图bits也不对,而且对16色、256色图标,如何获得它的调色板呢?把hIcon转换成Picture再保存,VB的SavePicture似乎只能保存16色位图,保存256色以上的图标的结果就是颜色数不对,这个方法也不行。头痛死了,这个问题困扰我好长时间,各位来帮我想想办法。
http://vbaccelerator.com/codelib/gfx/iconread.htm
源码:
http://vbaccelerator.com/codelib/gfx/cfileico.zip
http://www.applevb.com/sourcecode/icond.zip
把hIcon指向的内存地址的数据用数组读入,然后写出成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行不行?
-----------------------------------------------------------
把hIcon指向的内存地址的数据用数组读入,然后写出成ICO行不行?
-----------------------------------------------------------
我就是想做到这点,但hicon是句柄,它并不是直接指向内存数据的指针,其实我的问题也可以归纳为:如何通过句柄获得内存数据。我的问题可能比较怪,一个EXE文件,可以用loadlibary,loadresource这些API函数来获得其中包含的图标,也可以用shgetfileinfo来获得这个EXE文件的显示图标的hicon,前者没问题,后者把hicon显示到界面上也没问题,但现在我需要把后者保存为图标。
----------------------------------------------------------------
ico文件格式我了解
http://www.china-askpro.com/msg7/qa48.shtml
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保存为图标文件。