需要在客户端显示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; 参考网上的资料自己写了个函数,但是显示的图标有黑色的边请教告诉
//省略把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; 参考网上的资料自己写了个函数,但是显示的图标有黑色的边请教告诉
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;
}
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); 出现问题,,试试楼上说的..