메뉴 건너뛰기

app

[MFC] VIEW영역 캡쳐와 전체화면 캡쳐 저장

박영식2007.12.04 21:29조회 수 6626댓글 0

    • 글자 크기

 if (ar.IsStoring())
 {
  // TODO: add storing code here
  if(!m_pDibImage)
   return ;
  CFile* pImageFile = ar.GetFile();
  m_pDibImage->Write(pImageFile);


 }

 

 

//////////////

  // CWindowDC(메인 DC) 형식으로 DC를 얻게 된다.
 HDC h_screen_dc = ::GetWindowDC(NULL);
 // 현재 스크린의 해상도를 얻는다.
 int width = ::GetDeviceCaps(h_screen_dc, HORZRES);
 int height = ::GetDeviceCaps(h_screen_dc, VERTRES);

 // DIB의 형식을 정의한다.
 BITMAPINFO dib_define;
 dib_define.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 dib_define.bmiHeader.biWidth = width;
 dib_define.bmiHeader.biHeight = height;
 dib_define.bmiHeader.biPlanes = 1;
 dib_define.bmiHeader.biBitCount = 24;
 dib_define.bmiHeader.biCompression = BI_RGB;
 dib_define.bmiHeader.biSizeImage = (((width * 24 + 31) & ~31) >> 3) * height;
 dib_define.bmiHeader.biXPelsPerMeter = 0;
 dib_define.bmiHeader.biYPelsPerMeter = 0;
 dib_define.bmiHeader.biClrImportant = 0;
 dib_define.bmiHeader.biClrUsed = 0;

 // DIB의 내부 이미지 비트 패턴을 참조할 포인터 변수
 BYTE *p_image_data = NULL;
 // dib_define에 정의된 내용으로 DIB를 생성한다.
 HBITMAP h_bitmap = ::CreateDIBSection(h_screen_dc, &dib_define, DIB_RGB_COLORS, (void **)&p_image_data, 0, 0);
 // 이미지를 추출하기 위해서 가상 DC를 생성한다. 메인 DC에서는 직접적으로 비트맵에 접근하여
 // 이미지 패턴을 얻을 수 없기 때문이다.
 HDC h_memory_dc = ::CreateCompatibleDC(h_screen_dc);
 // 가상 DC에 이미지를 추출할 비트맵을 연결한다.
 HBITMAP h_old_bitmap = (HBITMAP)::SelectObject(h_memory_dc, h_bitmap);
 // 현재 스크린 화면을 캡쳐한다.
 ::BitBlt(h_memory_dc, 0, 0, width, height, h_screen_dc, 0, 0, SRCCOPY);
 // 본래의 비트맵으로 복구한다.
 ::SelectObject(h_memory_dc, h_old_bitmap);
 // 가상 DC를 제거한다.
 DeleteDC(h_memory_dc);

 // DIB 파일의 내용을 구성한다.
 BITMAPFILEHEADER dib_format_layout;
 ZeroMemory(&dib_format_layout, sizeof(BITMAPFILEHEADER));
 dib_format_layout.bfType = *(WORD*)"BM";
 dib_format_layout.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dib_define.bmiHeader.biSizeImage;
 dib_format_layout.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

 // DIB 파일을 생성한다.
 FILE *p_file = fopen("image.bmp", "wb");
 if(p_file != NULL){
  fwrite(&dib_format_layout, 1, sizeof(BITMAPFILEHEADER), p_file);
  fwrite(&dib_define, 1, sizeof(BITMAPINFOHEADER), p_file);
  fwrite(p_image_data, 1, dib_define.bmiHeader.biSizeImage, p_file);
  fclose(p_file);
 }

 if(NULL != h_bitmap) DeleteObject(h_bitmap);
 if(NULL != h_screen_dc) ::ReleaseDC(NULL, h_screen_dc);
박영식 (비회원)
    • 글자 크기

댓글 달기

박영식
2003.11.05 조회 17485
박영식
2008.07.23 조회 7760
suritam9
2013.08.23 조회 7110
lispro06
2016.11.01 조회 7075
이전 1 2 3 4 5 6 7 8 9 10... 14다음
첨부 (0)
위로