2009년 11월 5일 목요일

[MFC] Capture 후 PictureBox에 이미지 보이기

에헴..오늘은 MFC 바탕화면 캡쳐 이후 PictureBox에 이미지 띄우는 것에 대해서 작성해보렵니다.

 

우선 바탕화면 캡쳐하기!

 

*****************************************************************************************************

 

CBitmap m_bmpScreen;

    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();

    // 캡쳐된 비트맵 핸들을 CBitmap Object에 Attach한다.

    m_bmpScreen.Attach(hbitmap);
*****************************************************************************************************

 

캡쳐 한 이후.. PictureBox의 크기를 얻어서 OnPaint 함수에서 그리게 한다.

 

if (m_bmpScreen.GetSafeHandle())
 {
  CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트
  CDC memDC;
  int nScreenWidth, nScreenHeight;
  CStatic *staticCap1Size = (CStatic *)GetDlgItem(IDC_PICTURE_1);
  CRect rect;

  staticCap1Size->GetClientRect(rect);

  memDC.CreateCompatibleDC(&dc);
 
  CBitmap* pOldBmp = memDC.SelectObject(&m_bmpScreen);
  
  nScreenWidth  = GetSystemMetrics(SM_CXSCREEN);
  nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
 
  m_capture1.GetDC()->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, nScreenWidth, nScreenHeight, SRCCOPY);
  
  memDC.SelectObject(pOldBmp);
  memDC.DeleteDC();
 }

댓글 없음:

댓글 쓰기