안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

2013년 1월 16일 수요일

[MFC] Bitmap 출력하기

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&section=kin&rank=1&search_sort=0&spq=0&pid=RniKs35Y7thssc3XcGCsssssssh-101170&sid=UPZLTHJvLBYAAH4LFTU