请教:如何将内存数据(确定是一个图标)转换成一个 HICON 现在内存中有一个缓冲区PBYTE * pBuffer ,long lDataSize ,存有一个图标的数据,请问如何将这个缓冲区中的内容画出来,我想是是不是应该先转成HICON,再用DrawIcon图出来。请教如果将这个缓冲区中的内容转换成相应的HICON 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用下面这个函数得到HANDLE试试HICON CreateIconFromResource( PBYTE presbits, DWORD dwResSize, BOOL fIcon, DWORD dwVer); 还需要指定高度、宽度的话用这个:HICON CreateIconFromResourceEx( PBYTE pbIconBits, DWORD cbIconBits, BOOL fIcon, DWORD dwVersion, int cxDesired, int cyDesired, UINT uFlags); 使用CreateIconFromResourceEx()获取一个EXE或DLL文件中的图标RT_GROUP_ICON图标目录RT_GROUP_CURSOR鼠标目录LR_DEFAULTCOLOR使用的颜色 谢谢楼上几位的帮助这个方法我有试过的,CreateIconFromResource 和 CreateIconFromResourceEx 的第一个参数都只接收 LookupIconIdFromDirectory 或 LoadResource 所取得的Resource Bits ,直接用内存数据好象不行,返回原句柄为 NULL ,GetLastError 的返回值为 0 (正常成功完成 ?)所以不解 ,可能还是要另外想办法另外,我是处理已存在的内存数据,并不是取得EXE的图标还有就是 我的内存数据我直接存成ICO文件的话就是一个图标文件,用图标制作工具检查其文件格式是标准 WIN32的图标格式 那么就是说这块内存中有合法的ICONINFO结构了?用这个:CreateIconIndirect 回 pomelowu(羽战士) 可以这么说了,但是现在我不知道怎么填充 CreateIconIndirect的参数信息,也就是说,不知道怎么根据数据分析并填充这个结构typedef struct _ICONINFO { BOOL fIcon; DWORD xHotspot; DWORD yHotspot; HBITMAP hbmMask; HBITMAP hbmColor; } ICONINFO; 还请讲得更详细一点好了,先谢过 把这块内存指针直接转化为一个PICONINFO::CreateIconIndirect((PICONINFO) p); 回 pomelowu(羽战士) 试过了,不行 the following example uses CreateIcon to create a custom icon at run-time, based on bitmap bitmasks; it is included to illustrate how the system interprets icon bitmap bitmasks. 这是MSDN中的一句话,还有一个例子,也许对你有用! 回woodwoodwood3() 看过了,要使用那个例子的话,关键是怎么从现有的内存数据里定位 XOR 和AND 的两张图的PBYTE ,还是要先知道文件格式才成 问题基本上已解决,虽然用的不是楼上各位的方法,但还是谢谢大家我现在用的方法主要是在这个结构上做文章:typedef struct{ UINT Width, Height, Colors; // Width, Height and bpp LPBYTE lpBits; // ptr to DIB bits DWORD dwNumBytes; // how many bytes? LPBITMAPINFO lpbi; // ptr to header LPBYTE lpXOR; // ptr to XOR image bits LPBYTE lpAND; // ptr to AND image bits} ICONIMAGE, *LPICONIMAGE;从一个ICON文件格式中找到的,其中源码改造一下就能用了,谢谢大家的关注 To:85125你好,我碰到跟你这个有点类似的问题,你能把你的解决方法给说的详细点吗?thanks // Icon.h: interface for the CIcon class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_ICON_H__D7D1BA6D_A252_4893_92EC_7D6AE7343FD7__INCLUDED_)#define AFX_ICON_H__D7D1BA6D_A252_4893_92EC_7D6AE7343FD7__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class CIcon {public: CIcon(); virtual ~CIcon(); typedef struct { UINT Width,Height,Colors; LPBYTE lpBits; DWORD dwNumBytes; LPBITMAPINFO lpbi; LPBYTE lpXOR; LPBYTE lpAND; }ICONIMAGE,*LPICONIMAGE; typedef struct { BYTE bWidth; BYTE bHeight; BYTE bColorCount; BYTE bReserved; WORD wPlanes; WORD wBitCount; DWORD dwBytesInRes; DWORD dwImageOffset; }ICONDIRENTRY,*LPICONDIRENTRY; BOOL CreateFromBuff(LPBYTE pBuff,long lDataSize); HICON GetHICON(){return _hIcon;};protected: UINT CheckHead(const LPBYTE pBuff,long lSize); LPSTR FindDIBBits(LPSTR lpbi); DWORD PaletteSize(LPSTR lpbi); DWORD DIBNumColors(LPSTR lpbi); DWORD BytesPerLine(LPBITMAPINFOHEADER lpBMIH); HICON MakeIconFromResource(LPICONIMAGE lpIcon);private: HICON _hIcon; long _lPos;};#endif // !defined(AFX_ICON_H__D7D1BA6D_A252_4893_92EC_7D6AE7343FD7__INCLUDED_)// Icon.cpp: implementation of the CIcon class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "Icon.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////#define WIDTHBYTES(bits) ((((bits) + 31) >> 5)<<2)CIcon::CIcon(){ _hIcon = NULL; _lPos = 0;}CIcon::~CIcon(){ if (_hIcon != NULL) { DestroyIcon(_hIcon); } }UINT CIcon::CheckHead(const LPBYTE pBuff,long lSize){ _lPos = 0; WORD input; if (lSize <= sizeof(WORD) * 3) return (UINT)-1; memcpy(&input,pBuff + _lPos,sizeof(WORD));_lPos += sizeof(WORD); if (input != 0) return (UINT)-1; memcpy(&input,pBuff + _lPos,sizeof(WORD));_lPos += sizeof(WORD); if (input != 1) return (UINT)-1; memcpy(&input,pBuff + _lPos,sizeof(WORD));_lPos += sizeof(WORD); return input; //pBuff中包含的图标个数}LPSTR CIcon::FindDIBBits(LPSTR lpbi){ return (lpbi + *(LPDWORD)lpbi + PaletteSize(lpbi));}DWORD CIcon::PaletteSize(LPSTR lpbi){ return (DIBNumColors(lpbi) * sizeof(RGBQUAD));}DWORD CIcon::DIBNumColors(LPSTR lpbi){ WORD wBitCount; DWORD dwClrUsed; dwClrUsed = ((LPBITMAPINFOHEADER)lpbi)->biClrUsed; if (dwClrUsed) return (WORD)dwClrUsed; wBitCount = ((LPBITMAPINFOHEADER)lpbi)->biBitCount; switch(wBitCount) { case 1:return 2; case 4:return 16; case 8:return 256; case 16:return 65535; case 32:return 4294967295; default:return 0; } return 0;}DWORD CIcon::BytesPerLine(LPBITMAPINFOHEADER lpBMIH){ return WIDTHBYTES(lpBMIH->biWidth * lpBMIH->biPlanes * lpBMIH->biBitCount);}HICON CIcon::MakeIconFromResource(LPICONIMAGE lpIcon){ HICON hIcon = NULL; // Sanity Check if( lpIcon == NULL ) return NULL; if( lpIcon->lpBits == NULL ) return NULL; // Let the OS do the real work :) hIcon = CreateIconFromResourceEx( lpIcon->lpBits, lpIcon->dwNumBytes, TRUE, 0x00030000, (*(LPBITMAPINFOHEADER)(lpIcon->lpBits)).biWidth, (*(LPBITMAPINFOHEADER)(lpIcon->lpBits)).biHeight/2, 0 ); // It failed, odds are good we're on NT so try the non-Ex way if( hIcon == NULL ) { // We would break on NT if we try with a 16bpp image if(lpIcon->lpbi->bmiHeader.biBitCount != 16) { hIcon = CreateIconFromResource( lpIcon->lpBits, lpIcon->dwNumBytes, TRUE, 0x00030000 ); } } return hIcon;}BOOL CIcon::CreateFromBuff(LPBYTE pBuff,long lDataSize){ if (pBuff == NULL || lDataSize == 0) { return FALSE; } if (CheckHead(pBuff,lDataSize) == (UINT)-1) return FALSE; LPICONDIRENTRY lpIDE = (LPICONDIRENTRY)malloc(sizeof(ICONDIRENTRY)); if (lpIDE == NULL) return FALSE; memcpy(lpIDE,pBuff + _lPos,sizeof(ICONDIRENTRY)); LPICONIMAGE lpIconImage = (LPICONIMAGE)malloc(sizeof(ICONIMAGE)); if (lpIconImage == NULL) return FALSE; lpIconImage->lpBits = (LPBYTE)malloc(lpIDE->dwBytesInRes); memcpy(lpIconImage->lpBits,pBuff + lpIDE->dwImageOffset,lpIDE->dwBytesInRes); lpIconImage->lpbi = (LPBITMAPINFO)lpIconImage->lpBits; lpIconImage->Width = lpIconImage->lpbi->bmiHeader.biWidth; lpIconImage->Height = (lpIconImage->lpbi->bmiHeader.biHeight)/2; lpIconImage->Colors = lpIconImage->lpbi->bmiHeader.biPlanes * lpIconImage->lpbi->bmiHeader.biBitCount; lpIconImage->lpXOR = (LPBYTE)FindDIBBits((LPSTR)lpIconImage->lpbi); lpIconImage->lpAND = lpIconImage->lpXOR + (lpIconImage->Height*BytesPerLine((LPBITMAPINFOHEADER)lpIconImage->lpbi)); HICON hTemp = NULL; hTemp = MakeIconFromResource(lpIconImage); if (hTemp != NULL) { if (_hIcon != NULL) { DestroyIcon(_hIcon); } _hIcon = hTemp; } free(lpIconImage->lpBits); free(lpIconImage); free(lpIDE); return TRUE;}to Hswu这个是我用的,并不具普遍适用性,我暂时没有那么多时间,你要用的话可能要根据你的实际情况改一下才好 ,特别是在 Destory 方面 To:85125thanks, 我的问题已经解决,方法跟你的大部分不谋而合,还是非常感谢您。:) WDK编译问题:include <ntddk.h>提示找不到相应文件而引发的一连串问题。。 ADO DATA和DATA GRID控件搭配 双击选择datagrid显示的记录集中的一行 急:QQ的组和框下拉列表中的删除项功能是怎么实现的? 软件工程师的技术水平和技术境界 ActiveX 控件和DLL有何不同! 请教一个多文档打开的问题 关于EDIT的问题 请问DirectX与OpenGL的特点各是什么? 请问在VC6里面怎么实现DoEvents() 一个关于Custom Control 的问题? 【求助】高手帮忙看一下这个错误!!! 高难度问题,求救啊 多谢
HICON CreateIconFromResource( PBYTE presbits,
DWORD dwResSize,
BOOL fIcon,
DWORD dwVer
);
HICON CreateIconFromResourceEx( PBYTE pbIconBits,
DWORD cbIconBits,
BOOL fIcon,
DWORD dwVersion,
int cxDesired,
int cyDesired,
UINT uFlags
);
RT_GROUP_ICON图标目录
RT_GROUP_CURSOR鼠标目录
LR_DEFAULTCOLOR使用的颜色
还有就是 我的内存数据我直接存成ICO文件的话就是一个图标文件,用图标制作工具检查其文件格式是标准 WIN32的图标格式
typedef struct _ICONINFO {
BOOL fIcon;
DWORD xHotspot;
DWORD yHotspot;
HBITMAP hbmMask;
HBITMAP hbmColor;
} ICONINFO; 还请讲得更详细一点好了,先谢过
这是MSDN中的一句话,还有一个例子,也许对你有用!
{
UINT Width, Height, Colors; // Width, Height and bpp
LPBYTE lpBits; // ptr to DIB bits
DWORD dwNumBytes; // how many bytes?
LPBITMAPINFO lpbi; // ptr to header
LPBYTE lpXOR; // ptr to XOR image bits
LPBYTE lpAND; // ptr to AND image bits
} ICONIMAGE, *LPICONIMAGE;从一个ICON文件格式中找到的,其中源码改造一下就能用了,谢谢大家的关注
你好,我碰到跟你这个有点类似的问题,你能把你的解决方法给说的详细点吗?thanks
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_ICON_H__D7D1BA6D_A252_4893_92EC_7D6AE7343FD7__INCLUDED_)
#define AFX_ICON_H__D7D1BA6D_A252_4893_92EC_7D6AE7343FD7__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000class CIcon
{
public:
CIcon();
virtual ~CIcon();
typedef struct
{
UINT Width,Height,Colors;
LPBYTE lpBits;
DWORD dwNumBytes;
LPBITMAPINFO lpbi;
LPBYTE lpXOR;
LPBYTE lpAND;
}ICONIMAGE,*LPICONIMAGE;
typedef struct
{
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD dwBytesInRes;
DWORD dwImageOffset;
}ICONDIRENTRY,*LPICONDIRENTRY;
BOOL CreateFromBuff(LPBYTE pBuff,long lDataSize);
HICON GetHICON(){return _hIcon;};
protected:
UINT CheckHead(const LPBYTE pBuff,long lSize);
LPSTR FindDIBBits(LPSTR lpbi);
DWORD PaletteSize(LPSTR lpbi);
DWORD DIBNumColors(LPSTR lpbi);
DWORD BytesPerLine(LPBITMAPINFOHEADER lpBMIH);
HICON MakeIconFromResource(LPICONIMAGE lpIcon);
private:
HICON _hIcon;
long _lPos;
};#endif // !defined(AFX_ICON_H__D7D1BA6D_A252_4893_92EC_7D6AE7343FD7__INCLUDED_)
// Icon.cpp: implementation of the CIcon class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "Icon.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define WIDTHBYTES(bits) ((((bits) + 31) >> 5)<<2)
CIcon::CIcon()
{
_hIcon = NULL;
_lPos = 0;
}CIcon::~CIcon()
{
if (_hIcon != NULL)
{
DestroyIcon(_hIcon);
}
}UINT CIcon::CheckHead(const LPBYTE pBuff,long lSize)
{
_lPos = 0;
WORD input;
if (lSize <= sizeof(WORD) * 3)
return (UINT)-1;
memcpy(&input,pBuff + _lPos,sizeof(WORD));_lPos += sizeof(WORD);
if (input != 0)
return (UINT)-1;
memcpy(&input,pBuff + _lPos,sizeof(WORD));_lPos += sizeof(WORD);
if (input != 1)
return (UINT)-1;
memcpy(&input,pBuff + _lPos,sizeof(WORD));_lPos += sizeof(WORD);
return input; //pBuff中包含的图标个数
}LPSTR CIcon::FindDIBBits(LPSTR lpbi)
{
return (lpbi + *(LPDWORD)lpbi + PaletteSize(lpbi));
}DWORD CIcon::PaletteSize(LPSTR lpbi)
{
return (DIBNumColors(lpbi) * sizeof(RGBQUAD));
}DWORD CIcon::DIBNumColors(LPSTR lpbi)
{
WORD wBitCount;
DWORD dwClrUsed;
dwClrUsed = ((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
if (dwClrUsed)
return (WORD)dwClrUsed;
wBitCount = ((LPBITMAPINFOHEADER)lpbi)->biBitCount;
switch(wBitCount)
{
case 1:return 2;
case 4:return 16;
case 8:return 256;
case 16:return 65535;
case 32:return 4294967295;
default:return 0;
}
return 0;
}DWORD CIcon::BytesPerLine(LPBITMAPINFOHEADER lpBMIH)
{
return WIDTHBYTES(lpBMIH->biWidth * lpBMIH->biPlanes * lpBMIH->biBitCount);
}
HICON CIcon::MakeIconFromResource(LPICONIMAGE lpIcon)
{
HICON hIcon = NULL; // Sanity Check
if( lpIcon == NULL )
return NULL;
if( lpIcon->lpBits == NULL )
return NULL;
// Let the OS do the real work :)
hIcon = CreateIconFromResourceEx( lpIcon->lpBits, lpIcon->dwNumBytes, TRUE, 0x00030000,
(*(LPBITMAPINFOHEADER)(lpIcon->lpBits)).biWidth, (*(LPBITMAPINFOHEADER)(lpIcon->lpBits)).biHeight/2, 0 );
// It failed, odds are good we're on NT so try the non-Ex way
if( hIcon == NULL )
{
// We would break on NT if we try with a 16bpp image
if(lpIcon->lpbi->bmiHeader.biBitCount != 16)
{
hIcon = CreateIconFromResource( lpIcon->lpBits, lpIcon->dwNumBytes, TRUE, 0x00030000 );
}
}
return hIcon;
}BOOL CIcon::CreateFromBuff(LPBYTE pBuff,long lDataSize)
{
if (pBuff == NULL || lDataSize == 0)
{
return FALSE;
}
if (CheckHead(pBuff,lDataSize) == (UINT)-1)
return FALSE;
LPICONDIRENTRY lpIDE = (LPICONDIRENTRY)malloc(sizeof(ICONDIRENTRY));
if (lpIDE == NULL) return FALSE;
memcpy(lpIDE,pBuff + _lPos,sizeof(ICONDIRENTRY));
LPICONIMAGE lpIconImage = (LPICONIMAGE)malloc(sizeof(ICONIMAGE));
if (lpIconImage == NULL) return FALSE;
lpIconImage->lpBits = (LPBYTE)malloc(lpIDE->dwBytesInRes);
memcpy(lpIconImage->lpBits,pBuff + lpIDE->dwImageOffset,lpIDE->dwBytesInRes);
lpIconImage->lpbi = (LPBITMAPINFO)lpIconImage->lpBits;
lpIconImage->Width = lpIconImage->lpbi->bmiHeader.biWidth;
lpIconImage->Height = (lpIconImage->lpbi->bmiHeader.biHeight)/2;
lpIconImage->Colors = lpIconImage->lpbi->bmiHeader.biPlanes * lpIconImage->lpbi->bmiHeader.biBitCount;
lpIconImage->lpXOR = (LPBYTE)FindDIBBits((LPSTR)lpIconImage->lpbi);
lpIconImage->lpAND = lpIconImage->lpXOR + (lpIconImage->Height*BytesPerLine((LPBITMAPINFOHEADER)lpIconImage->lpbi));
HICON hTemp = NULL;
hTemp = MakeIconFromResource(lpIconImage);
if (hTemp != NULL)
{
if (_hIcon != NULL)
{
DestroyIcon(_hIcon);
}
_hIcon = hTemp;
}
free(lpIconImage->lpBits);
free(lpIconImage);
free(lpIDE);
return TRUE;
}to Hswu
这个是我用的,并不具普遍适用性,我暂时没有那么多时间,你要用的话可能要根据你的实际情况改一下才好 ,特别是在 Destory 方面
thanks, 我的问题已经解决,方法跟你的大部分不谋而合,还是非常感谢您。:)