drcarter의 DevLog

Screen Capture는 비교적 하는 방법은 간단하다.

아래는 스크린의 내용을 CBitmap 객체에 Attach 하는 함수이다.


void CScreenCaptureDlg::OnBnClickedBtnCapture()
{
    int nScreenWidth, nScreenHeight;


    // 스크린의 넓이와 높이를 받아오는 부분.

    nScreenWidth  = GetSystemMetrics(SM_CXSCREEN);
    nScreenHeight = GetSystemMetrics(SM_CYSCREEN);


    // Desktop의 DC를 얻어오는 곳이다.

    HDC hScreen = ::GetDC(NULL);

   // 스크린의 내용을 그릴 메모리 DC를 생성한다.
    HDC hMem = ::CreateCompatibleDC(hScreen);

 

    // 입력받은 DC의 Compatible DC에 이미지를 주어진 넓이와 높이로 생성한다.
    HBITMAP hbitmap = CreateCompatibleBitmap(hScreen,
                                             nScreenWidth,
                                             nScreenHeight);

 

   // 메모리 DC에 이미지를 그리기 위해 Bitmap Gdi Object를 선택한다.

    HGDIOBJ oldBitmap = ::SelectObject(hMem, hbitmap);

 

   // 메모리 DC에 스크린 이미지를 그린다.
   ::BitBlt(hMem, 0, 0, nScreenWidth, nScreenHeight, hScreen, 0, 0, SRCCOPY);
   

    // 이 뒷부분은 단지 리소스를 해지하기 위한 소스코드이다.

    ::SelectObject(hMem, oldBitmap);

    ::ReleaseDC(NULL, hScreen);
    ::DeleteDC(hMem);


    // 이전의 Bitmap 객체를 없엔다.

    if (m_bmpScreen.GetSafeHandle())
        m_bmpScreen.DeleteObject();


    // 캡춰된 Bitmap Handle을 CBitmap Object에 Attach한다.

    m_bmpScreen.Attach(hbitmap);


    // 캡춰받은 이미지를 WM_PAINT Message가 발생할때 처리하기 위해 클라이언트 영역을 무효화 시킨다.
    Invalidate();
}