프로젝트 수행 중..
제일 먼저 시도 한 것은 바탕화면을 캡쳐 해서 .jpg 파일이나 .png 파일을 생성!
그다음에는 생성된 파일을 네트워크로 전송하도록 하였다.
그런데..그렇게 하면 불필요한 과정 ( 캡쳐 후 파일을 생성하고 저장하고, 전송 후 destination에서 파일을 생성하고 저장하고..)이 들어가기 때문에!!!
메모리에서 파일로 저장을 하지 않고 stringstream을 통해 전송하도록..변경했다.
아..MFC를 control하는 것은 참..힘든거 같다.
그럼..방법을 알아봅시다. ^^
// 먼저, 현재 윈도우의 핸들을 얻어와야 겠죠?
CWnd* pWndDesktop = CWnd::GetDesktopWindow();
HBITMAP hbitmap;
HBITMAP oldBmp;
HDC hWindowDC;
HDC hMemDC;
CRect Rect;
int nScreenWidth, nScreenHeight;
hWindowDC = GetWindowDC(pWndDesktop->m_hWnd);
// 전체 화면의 크기를 Rect에 저장.
pWndDesktop->GetWindowRect(&Rect);
nScreenWidth = Rect.Width();
nScreenHeight = Rect.Height();
// 현재 윈도우와 호환되는 DC 생성.
hMemDC = CreateCompatibleDC(hWindowDC);
hbitmap = CreateCompatibleBitmap(hWindowDC, nScreenWidth, nScreenHeight);
oldBmp = (HBITMAP) SelectObject(hMemDC, hbitmap);
BitBlt(hMemDC, 0, 0, nScreenWidth, nScreenHeight, hWindowDC, 0,0, SRCCOPY);
이 과정을 거치면..자신의 전체 바탕화면을 캡쳐할 수 있습니다.
그리고..bitmap을 stringstream에 저장하기 위해.. char 배열로 변경합니다.
char * pbuff_bitmap = new char[dwBufferSize];
int size;
size = GetBitmapBits(hbitmap,dwBufferSize, pbuff_bitmap);
if(dwBufferSize != size)
{
AfxMessageBox("메모리에 할당된 비트맵 정보와 현재 비트맵 정보가 다르다!");
}
이렇게 하면 char 배열에 bitmap이 저장됩니다!
이것을 가지고 stringstream을 전송한 후 char 배열에 다시 읽어들여 bitmap으로 생성해주면 됩니다.
(물론..저는 여기서 boost 를 사용해서 zlib로 압축 후 전송, 해제하도록 하였습니다. 그대로 보내주는건..너무 크기 때문에?!ㅋ)
int size;
size = SetBitmapBits(desthbitmap,dwBufferSize,pbuff_bitmap);
전체 소스를 다 넣은 것은 아니구요..
머 암튼..압축된 데이터를 네트워크 전송으로 아직 해보지는 않았지만, 압축한 데이터 전송하고 받은 데이터 해제만 해준다면 문제는 없을 듯..
이제 해야하는건..hextile 알고리즘 분석 후 라이브러리화 하기 도전!
저번에 알고리즘 분석하다 말았는데..마저 해야겠군요..@.@
댓글 없음:
댓글 쓰기