描述:
我用ATL3.0开发的控件,打算用来绘制BMP图像,ATL开发中不支持MFC,全部使用SDK,但是绘制后图片变成了黑白了。对于读取BMP文件与绘制的源码我在exe环境下直接使用是没有问题的阿!百思不得其解,贴出来求哪位大虾相救。
以下是读取BMP文件的源码:
HBITMAP LoadBitmapFile(char *sFile,int &nWidth,int &nHeight,HDC hDc,HPALETTE *pPalette)
{
HFILE file;
OFSTRUCT OfStruct;
LPBITMAPINFOHEADER lpImgData;
LOGPALETTE *pLogPal;
LPRGBQUAD lpRGB;
HPALETTE hPrevPalette;
HLOCAL hPal;
DWORD LineBytes;
DWORD ImgSize;
DWORD NumColors;
DWORD i;
BITMAPFILEHEADER bh;
BITMAPINFOHEADER bi;
HBITMAP hBitmap=NULL;
HGLOBAL hImgData=NULL;
HPALETTE hOutPalette = NULL;
DWORD size;
file = (HFILE)OpenFile(sFile, (LPOFSTRUCT)&OfStruct, OF_READ);
size = (DWORD)sizeof(BITMAPFILEHEADER);
::ReadFile((void*)file,&bh,size,&size,NULL);
size = sizeof(BITMAPINFOHEADER);
ReadFile((void*)file,(void*)&bi,size,&size,NULL);
LineBytes = (DWORD)WIDTHBYTES(bi.biWidth * bi.biBitCount);
ImgSize = (DWORD)LineBytes*bi.biHeight;
if(bi.biClrUsed != 0)
{
NumColors = (DWORD)bi.biClrUsed;
}
else
{
switch(bi.biBitCount){
case 1:
NumColors=2;
break;
case 4:
NumColors=16;
break;
case 8:
NumColors=256;
break;
case 24:
NumColors=0;
break;
default:
::CloseHandle((void *)file);
return FALSE;
}
}
if(bh.bfOffBits != (DWORD)(NumColors * sizeof(RGBQUAD) + sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)))
{
::CloseHandle((void *)file);
return FALSE;
}
bh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + NumColors * sizeof(RGBQUAD) + ImgSize;
if((hImgData = GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER) +
NumColors * sizeof(RGBQUAD) + ImgSize))) == NULL)
{
::CloseHandle((void *)file);
return FALSE;
}
lpImgData = (LPBITMAPINFOHEADER)GlobalLock(hImgData);
::SetFilePointer((void *)file,sizeof(BITMAPFILEHEADER),NULL,FILE_BEGIN);
size = (DWORD)sizeof(BITMAPINFOHEADER)+ (long)NumColors * sizeof(RGBQUAD)+ImgSize;
::ReadFile((void *)file,(void*)lpImgData,size,&size,NULL);
::CloseHandle((void *)file);
if(NumColors != 0)
{
hPal = LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors * sizeof(PALETTEENTRY));
pLogPal = (LOGPALETTE*)LocalLock(hPal);
pLogPal->palNumEntries = (WORD)NumColors;
pLogPal->palVersion = 0x300;
lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPINFOHEADER));
for(i=0 ; i<NumColors ; i++)
{
pLogPal->palPalEntry[i].peRed = lpRGB->rgbRed;
pLogPal->palPalEntry[i].peGreen = lpRGB->rgbGreen;
pLogPal->palPalEntry[i].peBlue = lpRGB->rgbBlue;
pLogPal->palPalEntry[i].peFlags = (BYTE)0;
lpRGB ++;
}
hOutPalette = CreatePalette(pLogPal);
LocalUnlock(pLogPal);
LocalFree(hPal);
}
if(hOutPalette)
{
hPrevPalette = SelectPalette(hDc,hOutPalette,FALSE);
RealizePalette(hDc);
}
hBitmap = CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData,(LONG)CBM_INIT,
(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);
if(hOutPalette && hPrevPalette)
{
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc);
}
*pPalette = hOutPalette;
nWidth = bi.biWidth;
nHeight = bi.biHeight;
GlobalUnlock(hImgData);
return hBitmap;
}
在控件的OnDraw(ATL_DRAWINFO& di)函数中的绘制代码:
HRESULT hr;
RECT& rc = *(RECT*)di.prcBounds;
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
int width = ::GetSystemMetrics(SM_CXSCREEN);
int height = ::GetSystemMetrics(SM_CYSCREEN);
m_hMemDC = CreateCompatibleDC(di.hdcDraw);
int nWidth,nHeight;
HPALETTE hPal;
HBITMA