BITMAP
DIB(Device Independent Bitmap, *.bmp)
- 장치 독립적 : *.bmp로 존재 하며 운영체제에서 사용하기 위해서 DDB로 변환하는 작업을 거처야 한다.
DDB(Device Dependent Bitmap, *.raw)
- 장치 종속적 : 해당 장치에서만 사용
Window 생성시 반드시 생성되는 것
- Message Queue
- DC → CGDIObject [ (CBitmap), (CPen, CBrush, CFont) ]
- CBitmap : GDIObject 3개와는 성격이 다르다, 도화지의 성격,
SelectObject 사용으로 CBitmap 변경시 도화지가 바뀐다.
DC 생성 (메모리 DC)
- Window 생성시 기본으로 생성되는 DC 외에 사용자가 추가로 DC를 생성할수있다, 이를 메모리 DC라 부른다.
CBitmap class
BITMAP을 사용에 필요한 API를 모아놓은 MFC Class
Member Function
LoadBitmap( UINT nIDResource );
- 비트맵 리소스를 읽어온다, DIB 포맷을 DDB 포맷으로 변환.
BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );
- 하나의 DC에 있는 비트맵을 다른 DC로 복사하는 비트맵 함수
StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );
- BitBlt와 동작하는 방식이 같다, 크기와 높이를 따로 지정할 수 있어 확대및 축소 복사가 가능.
GetBitmap( BITMAP* pBitMap );
- BITMAP 정보를 BITMAP Struct에 넘겨준다.
Example
CPaintDC dc(this);
CDC temp_dc;
//temp_dc.CreateDC( ... ); // 속성을 다 지정해야 한다.
temp_dc.CreateCompatibleDC(&dc); // 넘겨받은 dc와 호환가능한 DC를 생성한다.
temp_dc.SelectObject(&m_my_bitmap); //CBitmap class 멤버변수 m_my_bitmap 선언
dc.BitBlt(200, 0, 60, 60, &temp_dc, 50, 50, SRCCOPY);
dc.DeleteDC();
① - 전체 window
② - 전체 window중 bitmap이 보여질 위치 및 범위.
***위 함수를 이용한 간단한 Bitmap 출력하기
비트맵 로드는 OnCreate()에서 하고
그리기 코드는 OnDraw() 내에서 실행함.
int CTetris_copyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CBitmap m_coverBitMap; // Bitmap 변수를 선언하고 그 변수에 LoadBitmap 하여
// Bitmap 로드함
m_coverBitMap.LoadBitmap(IDB_BITMAP1);
return 0;
}
void CTetris_copyView::OnDraw(CDC* pDC)
{
CTetris_copyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap = memDC.SelectObject(&m_coverBitMap);
pDC->BitBlt(0, 0, 715, 543, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
}
출처 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=68372414&qb=bWZjIG9uZHJhdyBiaXRtYXA=&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0&pid=RniKs35Y7thssc3XcGCsssssssh-101170&sid=UPZLTHJvLBYAAH4LFTU
그리기 코드는 OnDraw() 내에서 실행함.
int CTetris_copyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CBitmap m_coverBitMap; // Bitmap 변수를 선언하고 그 변수에 LoadBitmap 하여
// Bitmap 로드함
m_coverBitMap.LoadBitmap(IDB_BITMAP1);
return 0;
}
void CTetris_copyView::OnDraw(CDC* pDC)
{
CTetris_copyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap = memDC.SelectObject(&m_coverBitMap);
pDC->BitBlt(0, 0, 715, 543, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
}
출처 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=68372414&qb=bWZjIG9uZHJhdyBiaXRtYXA=&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0&pid=RniKs35Y7thssc3XcGCsssssssh-101170&sid=UPZLTHJvLBYAAH4LFTU