我用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;
HBITMAP hBitMap = NULL;
hBitMap = LoadBitmapFile("H:\\Agency\\RealAgent\\src\\RealEstateMgr\\map.bmp",nWidth,nHeight,(HDC)m_hMemDC,&hPal);
HBITMAP hOld = (HBITMAP)SelectObject(m_hMemDC,hBitMap);
SetStretchBltMode(m_hMemDC,COLORONCOLOR);
BitBlt (di.hdcDraw,rc.left,rc.top, rc.right, rc.bottom,
m_hMemDC,
rc.left,rc.top,// rc.right, rc.bottom,
SRCCOPY);
SelectObject(m_hMemDC,hOld);
DeleteObject(hBitMap);
DeleteDC(m_hMemDC);
return S_OK;
还烦请哪位高手指点一下,谢谢

解决方案 »

  1.   

    LoadBitmapFile 应该没问题检查一下这个m_hMemDC是否是黑白的
      

  2.   

    m_hMemDC是否是黑白是否黑白怎么检查?而且我尝试m_hMemDC初始化后FillRect后也没用阿,不知道怎么搞得。
    难道论坛上就没有高手写过显示BMP的控件——就像PictureBox那样的控件?
      

  3.   

    GetDeviceCaps, 
    FillRect可能就是因为这个原因而找不到颜色
      

  4.   

    我使用组件自带的颜色FillRect背景是没有问题的。GetDeviceCaps您是使用哪个参数呢?谢谢