Windows Mobile 에서 DC를 Bitmap 저장
어디서 가지고 온지는 기억이 안남...,ㅡ,ㅡ;;;
_SaveBitmap(HDC dcSave, HBITMAP bmSave, LPTSTR pszFileName)
{
BITMAP bmpSave = { 0, };
BITMAPINFO bmiSave = { 0, };
BITMAPFILEHEADER hdrSave = { 0, };
DWORD dwByteCount = 0;
void* pBuffer = NULL;
HDC dcDest = NULL;
HBITMAP bmDest = NULL;
HBITMAP bmDestOld = NULL;
HANDLE hFile = NULL;
if(NULL == bmSave)
return FALSE;
if(NULL == dcSave)
return FALSE;
::GetObject(bmSave, sizeof(BITMAP), &bmpSave);
bmiSave.bmiHeader.biHeight = bmpSave.bmHeight;
bmiSave.bmiHeader.biWidth = bmpSave.bmWidth;
bmiSave.bmiHeader.biPlanes = 1;
bmiSave.bmiHeader.biBitCount = 24;
bmiSave.bmiHeader.biSize = sizeof(bmiSave.bmiHeader);
bmiSave.bmiHeader.biSizeImage = ((bmiSave.bmiHeader.biWidth + 3) & (~3)) * bmiSave.bmiHeader.biHeight * bmiSave.bmiHeader.biBitCount / 8;
bmiSave.bmiHeader.biXPelsPerMeter = 3780;
bmiSave.bmiHeader.biYPelsPerMeter = 3780;
bmDest = ::CreateDIBSection(dcSave, &bmiSave, DIB_RGB_COLORS, (void**)&pBuffer, NULL, 0);
// bitmap 복사하는 곳. 빼면 저장 안됨.
dcDest = ::CreateCompatibleDC(dcSave);
bmDestOld = (HBITMAP)::SelectObject(dcDest, bmDest);
::BitBlt(dcDest, 0, 0, bmpSave.bmWidth, bmpSave.bmHeight, dcSave, 0, 0, SRCCOPY);
::SelectObject(dcDest, bmDestOld);
::DeleteDC(dcDest);
hFile = ::CreateFile(pszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
hdrSave.bfType = ((WORD) ('M' << 8) | 'B');
hdrSave.bfSize = sizeof(hdrSave) + sizeof(BITMAPINFOHEADER);
hdrSave.bfReserved1 = 0;
hdrSave.bfReserved2 = 0;
hdrSave.bfOffBits = hdrSave.bfSize;
::WriteFile(hFile, &hdrSave, sizeof(hdrSave), &dwByteCount, NULL);
::WriteFile(hFile, &bmiSave.bmiHeader, sizeof(bmiSave.bmiHeader), &dwByteCount, NULL);
::WriteFile(hFile, pBuffer, bmiSave.bmiHeader.biSizeImage, &dwByteCount, NULL);
::CloseHandle(hFile);
}
::DeleteObject(bmDest);
bmDest = NULL;
return TRUE;
}