메뉴 건너뛰기

app

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

박영식2007.12.04 21:29조회 수 6880댓글 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);
박영식 (비회원)
    • 글자 크기
[MFC] FTP 프로그램에서 DISCONNETION (by 박영식) [JS] 시점과 종점 정보로 라인 그리기(자바스크립트) (by 박영식)

댓글 달기

박영식
2010.09.09 조회 4787
박영식
2010.05.25 조회 4090
박영식
2010.01.14 조회 4969
박영식
2009.09.21 조회 4146
박영식
2008.08.18 조회 6061
박영식
2008.08.17 조회 4192
박영식
2008.07.24 조회 4621
박영식
2008.07.23 조회 7998
박영식
2008.07.22 조회 3347
박영식
2008.04.11 조회 2198
박영식
2008.01.20 조회 2038
박영식
2007.12.23 조회 3222
첨부 (0)
위로