- 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;
- }
转自: http://blog.youkuaiyun.com/infsafe/archive/2010/01/05/5138768.aspx