如题,代码如下:
        HDC hBufDC,hDC;       
HBITMAP hBitmap,hBitTemp;
//CClientDC dc(this); hDC = CreateCompatibleDC(m_WriteDlg.m_dc.m_hDC);
//创建设备上下文(HDC)
hBufDC = CreateCompatibleDC(NULL); //创建HBITMAP
hBitmap = CreateCompatibleBitmap(hDC,800,330);//CDC::FromHandle(::GetDC(NULL)),800,600
hBitTemp = (HBITMAP)SelectObject(hBufDC,hBitmap); ::BitBlt(hBufDC,0,0,800,330,hDC,0,0,SRCCOPY); //得到最终的位图信息
hBitmap = (HBITMAP)SelectObject(hBufDC,hBitTemp);
SelectObject(hBufDC,hBitmap); SaveBMP(hBitmap,"D:\\KLW.bmp",hDC);
//释放内存
DeleteObject(hBitTemp);
::DeleteDC(hBufDC);
SaveBMP(HBITMAP hBitmap,LPCTSTR lpFileName,HDC hWndDC)
{
/**/HDC hDC;//设备描述表
CDC dc;
int iBits;//当前显示分辨率下每个像素所占字节数
WORD wBitCount;//位图中每个像素所占字节数
DWORD dwPaletteSize = 0,dwBmBitSize,dwDIBSize,dwWritten;
//定义调色板大小,为图中像素字节大小,位图文件大小,写入文件字节数
BITMAP Bitmap;//位图属性结构
BITMAPFILEHEADER bmfHdr;//位图信息头结构
BITMAPINFOHEADER bi;//位图信息头结构
LPBITMAPINFOHEADER lpbi;//指向位图信息头结构 HANDLE fh,hDib,hPal,hOldPal = NULL;//定义文件,分配内存句柄,调色板句柄 //计算位图文件每个像素所占字节数
//hDC = ::CreateCompatibleDC(hWndDC);
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC,BITSPIXEL) * GetDeviceCaps(hDC,PLANES);
DeleteDC(hDC); if(iBits <= 1)
wBitCount = 1;
else if(iBits <=4)
wBitCount = 4;
else if(iBits <=8)
wBitCount = 8;
else if(iBits <=24)
wBitCount = 24;
else
wBitCount = 24; //计算调色板大小
if(wBitCount <= 8)
dwPaletteSize = (1 << wBitCount)*sizeof(RGBQUAD); //设置位图信息头结构
GetObject(hBitmap,sizeof(Bitmap),(LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0; dwBmBitSize = ((Bitmap.bmWidth * wBitCount + 31)/32)* 4 * Bitmap.bmHeight; //为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi; //处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if(hPal)
{
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal,FALSE);
RealizePalette(hDC);
} //获取该调色板下新的像素值
GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi + 
sizeof(BITMAPINFOHEADER) + dwPaletteSize,(LPBITMAPINFO)lpbi,DIB_RGB_COLORS);
//恢复调色板
if(hOldPal)
{
SelectPalette(hDC,(HPALETTE)hOldPal,TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL,hDC);
} fh = CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); if(fh==INVALID_HANDLE_VALUE)
return FALSE; //设置位图文件头
bmfHdr.bfType=0x4D42;
dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+
dwBmBitSize;
bmfHdr.bfSize=dwDIBSize;
bmfHdr.bfReserved1=0;
bmfHdr.bfReserved2 =0;
bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+
(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;  //写入位图文件头 
WriteFile(fh,(LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER),&dwWritten,NULL); //写入位图文件其余内容 
WriteFile(fh,(LPSTR)lpbi,dwDIBSize,&dwWritten,NULL); //清除 
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh); return TRUE;
}

解决方案 »

  1.   

    hDC是你源DC但是我没有看见你用hDC做绘制呀。你创建一个hDC默认就是黑色的一块。当然拷贝这个黑块肯定是黑色的了。
      

  2.   

    CDC* pDC = this->GetDC(); 
    bitmap1.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); 
    bitmap2.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); 
    CDC* p_richDC = this->GetWindowDC(); 
    tempDC.CreateCompatibleDC(p_richDC); 
    tempDC2.CreateCompatibleDC(p_richDC); 
    CBitmap *oldBitmap1,*oldBitmap2; 
    oldBitmap1 = tempDC.SelectObject(&bitmap1); 
    oldBitmap2 = tempDC2.SelectObject(&bitmap2); 
    tempDC2.FillSolidRect(0,0,new_rc.Width(),new_rc.Height(),RGB(255,0,0));//画一块红色的画布 
    tempDC.BitBlt(0,0,rc.Width(),rc.Height(),&tempDC2,0,0,SRCCOPY); 
    tempDC.SelectObject(oldBitmap1); 
    tempDC2.SelectObject(oldBitmap2); ....//这里写你保存位图的操作,位图是bitmap1 tempDC.DeleteDC(); 
    tempDC2.DeleteDC(); 
    ReleaseDC(pDC); 
    ReleaseDC(p_richDC); 
    bitmap1.DeleteObject(); 
    bitmap2.DeleteObject(); 
    oldBitmap1 = NULL; 
    oldBitmap2 = NULL;