DIB 형식 파일로 저장
CMaptoolDoc* pDoc = GetDocument(); HANDLE hDIB; BITMAPFILEHEADER bifileHdr; BYTE* lptrData;
CClientDC dc(this); //클립보드로 현재 이미지를 전송
CDC MemDC; MemDC.CreateCompatibleDC(&dc);
CRect rect; GetClientRect(rect); //뷰 영역의 크기를 얻어온다 rect.right = pDoc->map_arr_x*(pDoc->tile_pixel_x+pDoc->view_size); rect.bottom = pDoc->map_arr_y*(pDoc->tile_pixel_y+pDoc->view_size); CBitmap BMP; BMP.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); CBitmap* pOldBitmap = MemDC.SelectObject(&BMP); // 메모리 DC로 BitMap 선택.
MemDC.BitBlt(0, 0, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY); // 현재 화면의 내용을 메모리 DC로 전송한다. ///////////////////////////////////////////////////////////////////////////////// // 클립보드에 캡춰한 비트맵을 설정한다. OpenClipboard(); // 현재 클립보드를 연다. EmptyClipboard(); // 현재 클립보드의 내용을 모두 제거한다. SetClipboardData(CF_BITMAP, BMP.GetSafeHandle()); // Capture한 비트맵 설정 CloseClipboard(); MemDC.SelectObject(pOldBitmap); BMP.Detach(); // 비트맵 객체 제거 OpenClipboard(); //클립보드로 카피된게 DIB 형식이 아니면 바로 리턴. if(!IsClipboardFormatAvailable(CF_DIB)) { AfxMessageBox("Image file save Fail"); return; } hDIB = ::GetClipboardData(CF_DIB); if(!hDIB) { AfxMessageBox("Image file save Fail"); CloseClipboard(); return; } CloseClipboard(); //비트맵 헤더의 크기를 계산하고 bifileHdr.bfType = 0x4D42; bifileHdr.bfSize = sizeof(BITMAPFILEHEADER) + GlobalSize(hDIB); bifileHdr.bfReserved1 = 0; bifileHdr.bfReserved2 = 0; bifileHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
lptrData = (BYTE *)GlobalLock(hDIB); char szFilter[] = "BMP File(*.bmp)|*.bmp|All Files(*.*)|*.*||"; CFileDialog dlg(FALSE, "bmp", "*.bmp", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter); if(IDOK == dlg.DoModal()) { CFile file; file.Open(dlg.GetPathName(), CFile::modeCreate | CFile::modeWrite); file.Write(&bifileHdr, sizeof(BITMAPFILEHEADER)); file.Write(lptrData, GlobalSize(hDIB)); file.Close(); } GlobalUnlock(hDIB); GlobalFree(hDIB); 참조사이트 http://www.codeguru.com/Cpp/G-M/bitmap/capturing/article.php/c4919/ http://www.codeguru.com/Cpp/G-M/bitmap/capturing/article.php/c4915/ |