需要在客户端显示ico图标,图标是通过服务端发送过来的数据流显示的.
//省略把icon数据写入iconbuf中 
int   fPos     =   0; 
int   IconIndex   =   0; 
ICONDIRTEMP   *IconDir; 
BITMAPINFOHEADER   *IconHeadInfo;   //   位图信息头 
ICONDIRENTRYTEMP   *IconDirEntry;  //   读文件头 
IconDir   =   (ICONDIRTEMP   *)iconbuf; 
fPos   +=   sizeof(ICONDIRTEMP);  if((IconDir->idcount <1) && (IconDir-> idreserved!=   0)   && IconDir-> idtype !=   1) 

delete[]   iconbuf; 
return   hicon; 

//AfxMessageBox(_T( "不是icon文件 "));  //   读第index图标信息 
fPos   +=   sizeof(ICONDIRENTRYTEMP)*IconIndex; 
IconDirEntry  =  (ICONDIRENTRYTEMP*)(iconbuf+fPos); 
IconHeadInfo  =  (BITMAPINFOHEADER*)(iconbuf + IconDirEntry-> dwImageOffSet);  //图标的颜色数 
int   crs   =   0; 
if(IconHeadInfo-> biBitCount   <   24) 
crs   =   (int)pow(2.0,IconHeadInfo-> biBitCount); //图标数据 
int szImage = ((((IconHeadInfo-> biBitCount *IconDirEntry->bWidth)+31)/32)*   4)*IconDirEntry-> bHeight; 
BYTE *pXorBits = (BYTE*)IconHeadInfo + sizeof(BITMAPINFOHEADER) + crs * sizeof(RGBQUAD); 
BYTE *pAndBits   =   pXorBits   +   szImage;   //szImage = IconDirEntry-> bHeight * WIDTHBYTES( IconDirEntry->bWidth  * IconDirEntry->wPlanes * IconHeadInfo-> biBitCount); 
//BYTE *pAndBits   =   pXorBits   +  szImage; 
//CWnd*   pWnd   =   GetDlgItem(IDC_PREVIEW); CDC*   pControlDC   = AfxGetMainWnd()->GetDC();//获得设备的指针  //因为图标文件的bmp头标记的是两个图相的信息 
int   oldHeight = IconHeadInfo-> biHeight; 
int   oldImageSize = IconHeadInfo-> biSizeImage;   
IconHeadInfo-> biHeight         =   IconDirEntry-> bHeight; 
IconHeadInfo-> biSizeImage =   szImage;  HBITMAP   hBmpXor   =   CreateDIBitmap( 
pControlDC->m_hDC,
IconHeadInfo, 
CBM_INIT,    
pXorBits,
(BITMAPINFO*)IconHeadInfo,                   
DIB_RGB_COLORS);    HBITMAP   hBmpMask   =   CreateDIBitmap( 
pControlDC->m_hDC,                                                 
IconHeadInfo,     
CBM_INIT,                                       
pAndBits,
(BITMAPINFO*)IconHeadInfo,                   
DIB_RGB_COLORS);  ICONINFO   icf; 
icf.fIcon           =   TRUE; 
icf.hbmMask       =   hBmpMask;
icf.hbmColor     =   hBmpXor; 
icf.xHotspot     =   0; 
icf.yHotspot     =   0;  //还原原先的数据 
IconHeadInfo-> biHeight  =   oldHeight; 
IconHeadInfo-> biSizeImage   =   oldImageSize;  //创建图标 
hicon   =   CreateIconIndirect(&icf);   //本来想用   CreateIcon(),但是这个破函数就不支持调色板,小于24位的图标就不能处理 
//hicon = CreateIcon(AfxGetInstanceHandle(), IconHeadInfo->biWidth, IconHeadInfo->biHeight, IconHeadInfo->biPlanes, IconHeadInfo->biBitCount, pAndBits, pXorBits);
DeleteObject(hBmpXor);   
DeleteObject(hBmpMask);   
ReleaseDC(AfxGetMainWnd()->m_hWnd, pControlDC->m_hDC); delete[]   iconbuf; 
return   hicon; 参考网上的资料自己写了个函数,但是显示的图标有黑色的边请教告诉

解决方案 »

  1.   

    是不是跟CreateIconIndirect这个函数有关系,有没有其他函数替代呢?另外,楼主可以通过帖子左上或者左下方的“管理菜单”->“移动”,移动到你想要的帖子中,不知道给予移动权限,本人没有试过。
      

  2.   

    ICON数据结构错了,试试用这个
    typedef struct
    {
    UINT Width;
    UINT Height;
    UINT 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;
    HICON 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;
    }
      

  3.   

    我查出数据是对的,是在调用HBITMAP hBmpXor = CreateDIBitmap(  
    pControlDC->m_hDC,
    IconHeadInfo,  
    CBM_INIT,   
    pXorBits,
    (BITMAPINFO*)IconHeadInfo,   
    DIB_RGB_COLORS);   HBITMAP hBmpMask = CreateDIBitmap(  
    pControlDC->m_hDC,   
    IconHeadInfo,   
    CBM_INIT,   
    pAndBits,
    (BITMAPINFO*)IconHeadInfo,   
    DIB_RGB_COLORS);  出现问题,,试试楼上说的..