BOOL SaveDcToBMP(HDC m_hdcMem)
{
BOOL bReturn = TRUE;
HANDLE hFile = NULL; //handle of bitmap file which will be saved
DWORD dwWritten = 0; //written count
DWORD dwOffsetSize = 0;
DWORD dwBufferSize = 0;
WORD wBitCount = 32; //位图中每个像素所占字节数
HBITMAP hbitmapSave = NULL;
HBITMAP hbitmapOld = NULL;
HDC hDcDev = NULL;
HDC hDcMem = NULL;
BYTE *pBmpBuffer = NULL;
int iBits = 0;
BITMAP stSrcbmp;
BITMAPINFO srcdibbmap;
BITMAPFILEHEADER bmFileHeader; //位图文件头结构
SecureZeroMemory(&stSrcbmp, sizeof(BITMAP));
SecureZeroMemory(&srcdibbmap, sizeof(BITMAPINFO));
SecureZeroMemory(&bmFileHeader, sizeof(BITMAPFILEHEADER));
// Fill bitmap information constructor
srcdibbmap.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
srcdibbmap.bmiHeader.biWidth = WVGA_WIDTH;
srcdibbmap.bmiHeader.biHeight = WVGA_HIGHT;
srcdibbmap.bmiHeader.biPlanes = 1;
srcdibbmap.bmiHeader.biBitCount = wBitCount;
srcdibbmap.bmiHeader.biCompression = BI_RGB;
hDcMem = CreateCompatibleDC(NULL);
if (NULL == hDcMem)
{
bReturn = FALSE;
goto Exit;
}
hbitmapSave = CreateDIBSection(hDcMem, &srcdibbmap, DIB_RGB_COLORS, (void**)&pBmpBuffer, NULL, 0);
if (NULL == hbitmapSave)
{
bReturn = FALSE;
goto Exit;
}
hbitmapOld = (HBITMAP)SelectObject(hDcMem, hbitmapSave);
if (NULL == hbitmapOld)
{
bReturn = FALSE;
goto Exit;
}
//将传进来的DC画到定义的内存DC上去
if(!StretchBlt(hDcMem,
0,
0,
WVGA_WIDTH,
WVGA_HIGHT,
m_hdcMem,
0,
0,
m_iScaleWidth,
m_iScaleHight,
SRCCOPY))
{
bReturn = FALSE;
goto Exit;
}
if (0 == GetObject(hbitmapSave, sizeof(stSrcbmp), &stSrcbmp))
{
bReturn = FALSE;
goto Exit;
}
dwBufferSize = stSrcbmp.bmWidth * stSrcbmp.bmHeight * wBitCount / 8;
dwOffsetSize = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
// Fill bitmap header constructor
bmFileHeader.bfType = 0x4D42;
bmFileHeader.bfSize = dwOffsetSize + dwBufferSize;
bmFileHeader.bfReserved1 = 0;
bmFileHeader.bfReserved2 = 0;
bmFileHeader.bfOffBits = dwOffsetSize;
hFile = CreateFile(m_wszPicPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
bReturn = FALSE;
goto Exit;
}
if (!WriteFile(hFile, &bmFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL))
{
bReturn = FALSE;
goto Exit;
}
if (!WriteFile(hFile, &srcdibbmap, sizeof(BITMAPINFO), &dwWritten, NULL))
{
bReturn = FALSE;
goto Exit;
}
if (!WriteFile(hFile, pBmpBuffer, dwBufferSize, &dwWritten, NULL))
{
bReturn = FALSE;
goto Exit;
}
bReturn = TRUE;
Exit:
if (INVALID_HANDLE_VALUE != hFile)
{
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
return bReturn;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/infsafe/archive/2010/01/05/5138768.aspx