OFFICE/프로그램

MFC에서 비트맵을 다루는 방법.

gandus 2011. 7. 20. 11:52
일단 비트맵을 출력하려면 2개의 DC가 필요하다.

1. 비트맵이 출력될 화면 윈도우의 DC
2. 메모리에 만들어진 DC



CClientDC WinDC(this);   // 클라이언트의 DC를 받아온다.

CDC MemDC;                // 메모리에 상주하기 위해서 DC를 생성한다.


3. 그 후 서로 호환이 되도록, 연결하여준다.

MemDC.CreateCompatibleDC(&WinDC);   //   클라이언트 DC의 주소값을 넘겨준다.



4. 비트맵 읽어온다.


CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP11) ;    //  리소스를 불러온다.

Bitmap bmpInfo;
bitmap.GetBitmap(&bmpInfo);             // 비트맵 객체에 받아와서, 비트맵 정보를 알 수 있다.
 



5. 비트맵을 DC에 선택한다.


CBitmap *pOldBitmap = ( CBitmap * ) MemDC.SelectObject(&bitmap) ;



6.비트맵 블록 전송

기본적으로 비트맵을 출력하는 방법은 BitBlt를 사용한다.


BOOL CDC::BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );

▶hDC:비트맵이 복사될 DC

▶X,Y,nWidth,nHeight:비트맵이 복사될 위치의 좌상단 좌표와 폭, 넓이, 이 값은 논리적 좌표값이다.

▶HSrcDC:복사될 비트맵을 가지고 있는 DC. 만약 dwROP가 소스가 필요없는 값이라면 NULL이 될 수도 있다.

▶XSrc,YSrc:복사될 비트맵의 좌측 상단 좌표이며 복사처와 마찬가지로 논리적 좌표값이다. 이 값이 0일 경우 전체 비트맵을 복사한다. 복사원의 폭과 높이는 복사처의 nWidth, nHeight가 적용된다.

▶dwROP:ROP코드, 즉 브러쉬와 복사원, 복사처의 비트맵 색상이 논리 연산될 방법을 지정한다. 모두 256개의 가능한 값이 있지만 실제로 의미를 갖는 없은 다음 15개이며 매크로 상수가 정의되어 있다. 이 외의 ROP코드가 필요할 경우에는 상수를 직접 사용해야 한다. 아래 표에서 S는 복사원 (Source), D는 복사처(Destination), P는 패턴(Pattern, 즉 브러쉬)를 의미한다.
 


WinDC.BitBlt(100, 200, 20, 30, &MemDC, 30, 40, SRCCOPY);  //    SRCCOPY는 흔히 사용하는 코드이다. 기존값을
                                                                                             무시하고 다시 그린다는 뜻이다.




7.  그리고 이전의 DC를 복원한다.


MemDC.SelectObject(pOldBitmap) ;   





 


비트맵의 확대와 축소는 다음 함수를 이용해서 한다.

BOOL StretchBlt(  int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc,
                          int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);


복잡해 보이지만, BitBlt에서  소스 이미지의 폭과 높이를 선택하는 것만 추가 된 것이다.