본문 바로가기
프로그래밍/MFC

MFC-CImage( 스크린 샷 찍기 )

by 리뷰하는 (게임)프로그래머_리프TV 2010. 5. 17.



화면에 있는 스크린 샷을 찍을땐 어떻게 해야 할까,

그것도 작업 영역에 대해서만,

책에 있는 예제를 조금 변경해서 원하는 결과를 만들었지만,

더 나은 방법이 있는지는 아직 잘 모르겠다.

게임을 하다보면 스크린 샷을 찍게 될 경우가 종종 있다.

그랬을 경우 풀스크린이라면 상관 없을지도 모르나,

창모드라면 윈도우 화면 전체가 아닌 현재 플레이 중인 게임 화면만 이미지로 저장 되어야 한다고 생각한다.

프로젝트에서 WM_PAINT를 추가 하여 아무 이미지나 화면에 띄워 보자.
(필자는 이전의 결과 사용)

그 후 원하는 메시지 탭을 하나 추가해 보자.

키보드 라던지, 마우스 라던지,

추가한 이후에 다음처럼 코드를 작성한다.

// View::OnLButtonDown
	// 바탕 화면 윈도우 객체에 대한 포인터를 얻는다.
	CWnd* pWndDesktop = GetDesktopWindow();
	// 바탕 화면 윈도우 DC
	CWindowDC ScrDC(pWndDesktop);
	// 뷰 윈도우 DC
	CClientDC dc(this);

	// Rect를 사용해서 작업 영역에 대한 좌표를 얻고,
	CRect Rect;
	GetClientRect( &Rect );

	// 그 위치를 현재 윈도우의 절대 좌표로 변경해 주자.
	CWnd::GetWindowRect( &Rect );

	// CImage를 하나 만들고
	CImage Image;
	// 스캔을 시작할 x, y 위치와
	int sx = Rect.left;
	int sy = Rect.top;
	// 작업 영역에 대한 크기를 각각 임시로 저장해 두자.
	int cx = Rect.Width();
	int cy = Rect.Height();

	// 작업 영역의 크기만큼, 현재 바탕화면의 속성과 동일한 image를 생성한다.
	Image.Create( cx, cy, ScrDC.GetDeviceCaps( BITSPIXEL ) );

	// 이미지 DC에 현재 작업 영역의 절대 좌표를 사용해 그 크기만큼 저장하게 한다.
	CDC* pDC = CDC::FromHandle( Image.GetDC() );
	pDC->BitBlt( 0, 0, cx, cy, &ScrDC, sx, sy, SRCCOPY );
	Image.ReleaseDC();

	// 저장된 이미지를 원하는 파일명, 포멧타입을 지정해서 저장한다.
	Image.Save( TEXT("Desktop.jpg"), Gdiplus::ImageFormatJPEG );

	// 그 파일을 실행해 준다.
	::ShellExecute( NULL, 
		TEXT("open"), TEXT("Desktop.jpg" ),
		NULL, NULL, SW_SHOW );​


기본적인 구조 설명은 주석으로 달아 놓았고.
살작 자세히 보아야 할 부분은
Create() 함수화 Save(), ShellExecute부분 인것 같다고 생각한다.
Create는 x, y의 크기 만큼, 이미지를 생성한다.
3번째 인자는 어떤 속성인지 정하는 부분인데, 예제에서는 바탕화면과 동일한 색상수를 사용한다고 보면 된다.
다음으로 Save는 먼저 파일의 이름을 지정하고, 그 포멧 타입을 지정한다.
JPEG, BMP, GIF, PNG등이 같이 존재한다.
마지막으로 파일을 실행하는 ShellExecute인데,
1번째 인자로 부모 핸들( 예제에서는 NULL이기 때문에 바탕 화면이 되고 )
2번째 인자는 어떤 동작을 할 것인지에 대해 지정해 준다. open이기 때문에 실행을 의미한다.(또한 explore, edit, find, print등이 존재)
3번째로는 어떤 대상을 사용할 것이가에 대해서 이며(여기서는 open할 대상)
4번째는 3번째 인자가 실행 파일인 경우 실행 파일의 실행 인자를 명시,
5번째는 실행할 프로그램의 현재 폴더 경로 이 값이 NULL이면 윈도우 기본 설정을 적용한다고 한다.
마지막인자는 nShowCmd인데,
어떤식으로 보여 줄지에 대한 플래그 값정도로 예상된다.

// 실행 화면


// 스크린 샷을 찍은 후 저장된 파일,