现在内存中有一个缓冲区PBYTE * pBuffer ,long lDataSize ,存有一个图标的数据,请问如何将这个缓冲区中的内容画出来,我想是是不是应该先转成HICON,再用DrawIcon图出来。请教如果将这个缓冲区中的内容转换成相应的HICON

解决方案 »

  1.   

    用下面这个函数得到HANDLE试试
    HICON CreateIconFromResource(          PBYTE presbits,
        DWORD dwResSize,
        BOOL fIcon,
        DWORD dwVer
    );
      

  2.   

    还需要指定高度、宽度的话用这个:
    HICON CreateIconFromResourceEx(          PBYTE pbIconBits,
        DWORD cbIconBits,
        BOOL fIcon,
        DWORD dwVersion,
        int cxDesired,
        int cyDesired,
        UINT uFlags
    );
      

  3.   

    使用CreateIconFromResourceEx()获取一个EXE或DLL文件中的图标
    RT_GROUP_ICON图标目录
    RT_GROUP_CURSOR鼠标目录
    LR_DEFAULTCOLOR使用的颜色
      

  4.   

    谢谢楼上几位的帮助这个方法我有试过的,CreateIconFromResource 和 CreateIconFromResourceEx 的第一个参数都只接收 LookupIconIdFromDirectory 或 LoadResource 所取得的Resource Bits ,直接用内存数据好象不行,返回原句柄为 NULL ,GetLastError 的返回值为 0 (正常成功完成 ?)所以不解 ,可能还是要另外想办法另外,我是处理已存在的内存数据,并不是取得EXE的图标
    还有就是 我的内存数据我直接存成ICO文件的话就是一个图标文件,用图标制作工具检查其文件格式是标准 WIN32的图标格式
      

  5.   

    那么就是说这块内存中有合法的ICONINFO结构了?用这个:CreateIconIndirect
      

  6.   

    回 pomelowu(羽战士) 可以这么说了,但是现在我不知道怎么填充 CreateIconIndirect的参数信息,也就是说,不知道怎么根据数据分析并填充这个结构
    typedef struct _ICONINFO { 
       BOOL    fIcon; 
       DWORD   xHotspot; 
       DWORD   yHotspot; 
       HBITMAP hbmMask; 
       HBITMAP hbmColor; 
    } ICONINFO; 还请讲得更详细一点好了,先谢过
      

  7.   

    把这块内存指针直接转化为一个PICONINFO::CreateIconIndirect((PICONINFO) p);
      

  8.   

    回 pomelowu(羽战士) 试过了,不行
      

  9.   

    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中的一句话,还有一个例子,也许对你有用!
      

  10.   

    回woodwoodwood3() 看过了,要使用那个例子的话,关键是怎么从现有的内存数据里定位 XOR 和AND 的两张图的PBYTE ,还是要先知道文件格式才成
      

  11.   

    问题基本上已解决,虽然用的不是楼上各位的方法,但还是谢谢大家我现在用的方法主要是在这个结构上做文章: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文件格式中找到的,其中源码改造一下就能用了,谢谢大家的关注
      

  12.   

    To:85125
    你好,我碰到跟你这个有点类似的问题,你能把你的解决方法给说的详细点吗?thanks
      

  13.   

    // 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_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  方面
      

  14.   

    To:85125
    thanks, 我的问题已经解决,方法跟你的大部分不谋而合,还是非常感谢您。:)