MFC/Bitmap
Bitmap Save
곰돌이짱
2013. 8. 8. 17:50
void CCatchScreenDlg::SaveScreenToFile(LPCTSTR szFileName) { HDC hScrDC = ::GetDC(NULL); HDC hMemDC = NULL; BYTE *lpBitmapBits = NULL; int nWidth = GetSystemMetrics(SM_CXSCREEN); int nHeight = GetSystemMetrics(SM_CYSCREEN); hMemDC = ::CreateCompatibleDC(hScrDC); BITMAPINFO bi; ZeroMemory(&bi, sizeof(BITMAPINFO)); bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth = nWidth; bi.bmiHeader.biHeight = nHeight; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 24; HBITMAP bitmap = ::CreateDIBSection(hMemDC, &bi, DIB_RGB_COLORS, (LPVOID*)&lpBitmapBits, NULL, 0); HGDIOBJ oldbmp = ::SelectObject(hMemDC, bitmap); ::BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, 0, 0, SRCCOPY); BITMAPFILEHEADER bh; ZeroMemory(&bh, sizeof(BITMAPFILEHEADER)); bh.bfType = 0x4d42; //bitmap bh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); bh.bfSize = bh.bfOffBits + ((nWidth*nHeight)*3); CFile file; if(file.Open(szFileName, CFile::modeCreate | CFile::modeWrite)) { file.Write(&bh, sizeof(BITMAPFILEHEADER)); file.Write(&(bi.bmiHeader), sizeof(BITMAPINFOHEADER)); file.Write(lpBitmapBits, 3 * nWidth * nHeight); file.Close(); } ::SelectObject(hMemDC, oldbmp); ::DeleteObject(bitmap); ::DeleteObject(hMemDC); ::ReleaseDC(NULL, hScrDC); }