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);
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;
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);
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);
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);
}
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);
if(NULL != h_screen_dc) ::ReleaseDC(NULL, h_screen_dc);
댓글 달기