16,470
社区成员
发帖
与我相关
我的任务
分享
BOOL WriteIcon2File(LPBITMAPINFOHEADER pbifh)
{// Open file
CString name="any.ico";
HANDLE hFile;
DWORD dwBytesWritten;
hFile = CreateFile(name,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
// Write the header (the first 3 words of type ICONDIR)
WriteICOHeader(hFile,1);// 1 icon
// Color bits
DWORD lpvColorBits=(DWORD)pbifh+sizeof(BITMAPINFOHEADER)+PaletteSize(pbifh);
DWORD dibColorSize = WIDTHBYTES(pbifh->biWidth*pbifh->biBitCount)*pbifh->biHeight/2;
// Mask bits
DWORD lpvMaskBits=lpvColorBits+dibColorSize;
DWORD dibMaskSize=WIDTHBYTES(pbifh->biWidth*1)*pbifh->biHeight/2;
// Write the ICONDIRENTRY
ICONDIRENTRY ide;
// Convert internal format to ICONDIRENTRY
ide.bWidth = (BYTE)pbifh->biWidth;//32
ide.bHeight = (BYTE)pbifh->biHeight;//32
ide.bReserved = 0;
ide.wPlanes = pbifh->biPlanes;//1
ide.wBitCount = pbifh->biBitCount;//
//
if((ide.wPlanes * ide.wBitCount) >= 8) ide.bColorCount = 0;
else ide.bColorCount = 1 << (ide.wPlanes * ide.wBitCount);
// 512+128+40+64=744
ide.dwBytesInRes = dibColorSize+dibMaskSize+sizeof(BITMAPINFOHEADER)+PaletteSize(pbifh);//
ide.dwImageOffset = 3*sizeof(WORD) + /* entryNum=1 */ sizeof(ICONDIRENTRY)+PaletteSize(pbifh);
// Write ICONDIRENTRY
WriteFile(hFile,&ide,sizeof(ICONDIRENTRY),&dwBytesWritten,NULL);
// write bifh + pal
WriteFile(hFile,(VOID*)pbifh,sizeof(BITMAPINFOHEADER)+PaletteSize(pbifh),&dwBytesWritten,0);//
//write color dibs
WriteFile(hFile,(VOID*)lpvColorBits,dibColorSize,&dwBytesWritten,0);//616
// write mask dibs
WriteFile(hFile,(VOID*)lpvMaskBits,dibMaskSize,&dwBytesWritten,0);//128
//
CloseHandle(hFile);
AfxMessageBox("Selected Icon has saved to file 'Any.ico'\n");
//
return TRUE;
}