在windows上从内存创建HICON

在windows上从内存创建HICON,c,winapi,C,Winapi,我将.ico文件的内容作为const char*保存在内存中,我希望从该数据创建一个HICON。我目前的方法是将数据写入临时文件,然后使用LoadImage。是否可以直接从内存创建图标?如果不使用GDI+也不想这样做,则必须自己进行一些解析,因为.ICO文件的格式与.EXE/.DLL中的图标资源不完全相同,因此无法使用基于资源的图标函数。官方的二进制规范可以找到,有一个关于它的伟大的博客系列 如果.ico文件中有多个图像,则必须在图标目录上循环,直到找到满意的图像维度。如果不想使用GDI+进行此

我将
.ico
文件的内容作为
const char*
保存在内存中,我希望从该数据创建一个
HICON
。我目前的方法是将数据写入临时文件,然后使用
LoadImage
。是否可以直接从内存创建图标?

如果不使用GDI+也不想这样做,则必须自己进行一些解析,因为.ICO文件的格式与.EXE/.DLL中的图标资源不完全相同,因此无法使用基于资源的图标函数。官方的二进制规范可以找到,有一个关于它的伟大的博客系列


如果.ico文件中有多个图像,则必须在图标目录上循环,直到找到满意的图像维度。如果不想使用GDI+进行此操作,则可以调用创建一个
HICON
,也可以自己进行一些解析,因为.ICO文件的格式与.EXE/.DLL中的图标资源不完全相同,因此无法使用基于资源的图标函数。官方的二进制规范可以找到,有一个关于它的伟大的博客系列


如果.ico文件中有多个图像,则必须在图标目录上循环,直到找到满意的图像维度。然后,您可以调用创建一个
HICON

使用
CreateIcon
您当然可以创建图标,但我不确定您是否可以为其提供png格式的图像数据

我成功地使用了(很抱歉使用了其他语言,但以它为例,您可以在C中直接使用该函数):

大小x,大小y=32,32 LR_DEFAULTCOLOR=0

with open("my32x32.png", "rb") as f:
    png = f.read()
hicon = CreateIconFromResourceEx(png, len(png), 1, 0x30000, size_x, size_y, LR_DEFAULTCOLOR)

希望它能帮助您。

使用
CreateIcon
您当然可以创建图标,但我不确定您是否可以为其提供png格式的图像数据

我成功地使用了(很抱歉使用了其他语言,但以它为例,您可以在C中直接使用该函数):

大小x,大小y=32,32 LR_DEFAULTCOLOR=0

with open("my32x32.png", "rb") as f:
    png = f.read()
hicon = CreateIconFromResourceEx(png, len(png), 1, 0x30000, size_x, size_y, LR_DEFAULTCOLOR)

希望对您有所帮助。

是的。分析文件并创建图标。@DavidHeffernan我试图避免创建文件。我将图标的内容作为字符数组保存在内存中,并希望直接从该数据创建HICON。请查看
CreateIconFromResource
。关于ico格式的文章很多。如果可以使用,可以使用
CreateStreamOnHGlobal()
SHCreateMemStream()
将原始ICO数据包装在
IStream
中,然后将该流传递给
Bitmap
类构造函数或
Bitmap::FromStream()
方法,然后最后调用
Bitmap::ToHICON()
方法。分析文件并创建图标。@DavidHeffernan我试图避免创建文件。我将图标的内容作为字符数组保存在内存中,并希望直接从该数据创建HICON。请查看
CreateIconFromResource
。关于ico格式的文章很多。如果可以使用,可以使用
CreateStreamOnHGlobal()
SHCreateMemStream()
将原始ICO数据包装在
IStream
中,然后将该流传递给
Bitmap
类构造函数或
Bitmap::FromStream()
方法,然后最后调用
Bitmap::ToHICON()
方法。