오늘은 바탕화면 전체를 캡쳐하는 방법에 대해 설명하겠습니다.
HDC를 한번도 사용해본적이 없다면 여기를 한번 봐주시면 감사하겠습니다.
바탕화면을 핸들을 얻기 위한 함수는 GetDesktopWindow입니다.
HWND GetDesktopWindow();
프로젝트를 생성 하신 후 아래와 같이 스태틱과 버튼 컨트롤을 배치합니다.
![](https://3001ssw.com/wp-content/uploads/2023/07/img-min-18.png)
스태틱 컨트롤 변수를 헤더파일에 아래와 같이 선언합니다.
CStatic m_stDraw;
확인 버튼을 더블 클릭하여서 GetDesktopWindow 함수를 사용하여 핸들을 얻습니다.
HWND hwndDesktop = ::GetDesktopWindow(); // 바탕화면 핸들 얻기
RECT rectDesk;
::GetWindowRect( hwndDesktop, &rectDesk ); // 바탕화면 크기
핸들을 얻고 크기를 얻은 다음 바탕 화면의 HDC를 만들어 줍니다.
HWND hwndDesktop = ::GetDesktopWindow(); // 바탕화면 핸들 얻기
RECT rectDesk;
::GetWindowRect( hwndDesktop, &rectDesk ); // 바탕화면 크기 얻기
HDC hdcDesk = ::GetDC( hwndDesktop ); // 바탕화면 DC 얻기
바탕화면에 대한 비트맵 정보를 얻었으면 이제 스태틱 컨트롤의 DC와 크기도 얻습니다.
RECT rectDraw;
::GetWindowRect( m_stDraw.m_hWnd, &rectDraw ); // 스태틱 컨트롤 크기 얻기
HDC hdcDraw = ::GetDC( m_stDraw.m_hWnd ); // 스태틱 컨트롤 DC 얻기
바탕 화면의 그림을 스태틱 컨트롤에 그려줍니다.
::SetStretchBltMode( hdcDraw, HALFTONE );
::StretchBlt( hdcDraw, 0, 0, rectDraw.right - rectDraw.left, rectDraw.bottom - rectDraw.top,
hdcDesk, 0, 0, rectDesk.right - rectDesk.left, rectDesk.bottom - rectDesk.top, SRCCOPY );
실행 시켜보면 아래와 같이 작동합니다.
![](https://3001ssw.com/wp-content/uploads/2023/07/img-min-11.gif)
전체 코드는 아래와 같습니다.
void CMFCApplication1Dlg::OnBnClickedOk()
{
HWND hwndDesktop = ::GetDesktopWindow(); // 바탕화면 핸들 얻기
RECT rectDesk;
::GetWindowRect( hwndDesktop, &rectDesk ); // 바탕화면 크기 얻기
HDC hdcDesk = ::GetDC( hwndDesktop ); // 바탕화면 DC 얻기
RECT rectDraw;
::GetWindowRect( m_stDraw.m_hWnd, &rectDraw ); // 스태틱 컨트롤 크기 얻기
HDC hdcDraw = ::GetDC( m_stDraw.m_hWnd ); // 스태틱 컨트롤 DC 얻기
::SetStretchBltMode( hdcDraw, HALFTONE );
::StretchBlt( hdcDraw, 0, 0, rectDraw.right - rectDraw.left, rectDraw.bottom - rectDraw.top,
hdcDesk, 0, 0, rectDesk.right - rectDesk.left, rectDesk.bottom - rectDesk.top, SRCCOPY );
}