더북(TheBook)

4.2.4 비트맵 화면 출력

비트맵을 화면에 출력하는 멤버 함수 이름은 Draw이며, 출력 방식에 따라 3가지 형태로 재정의overloading되어 있다. 3개의 Draw 함수 원형은 다음과 같다.

void Draw(HDC hdc, int dx = 0, int dy = 0); 
                                                              // (1)
• void Draw(HDC hdc, int dx, int dy, int dw, int dh, DWORD dwRop = SRCCOPY); 
                                                              // (2)
• void Draw(HDC hdc, int dx, int dy, int dw, int dh, int sx, int sy,
      int sw, int sh, DWORD dwRop = SRCCOPY);                 // (3)

(1)번의 Draw 함수는 비트맵을 원본 크기 그대로 출력한다. 첫 번째 함수 인자 hdc는 출력 윈도우의 디바이스 컨텍스트 핸들 값이고, dxdy는 비트맵을 출력할 위치의 좌표이다. (1)번 Draw는 비트맵을 확대 또는 축소하지 않으므로 내부적으로 SetDIBitsToDevice 함수를 사용한다. (2)번의 Draw 함수는 비트맵 원본 전체를 확대 또는 축소하여 출력할 수 있다. (dx, dy)가 출력 사각형 영역의 시작 좌표이고 (dw, dh)가 가로, 세로 크기이다. 마지막 (3)번의 Draw는 원본 비트맵의 부분 영역을 출력할 수 있는 기능을 가지고 있다. 원본 비트맵에서 화면에 출력할 사각형 영역의 좌상단 좌표가 (sx, sy)이고, 가로 및 세로 크기가 (sw, sh)로 지정된다. (2)번과 (3)번의 Draw 함수는 내부적으로 StretchDIBits 함수를 사용한다. dwRop 인자는 StretchDIBits 함수에서 사용되는 래스터 연산 방법을 나타내며, IppDib.h 파일에 디폴트 인자로 SRCCOPY가 지정되어 있으므로 함수 호출 시 생략해도 무방하다.

IppDib 클래스의 Draw 멤버 함수들의 전체 구현은 소스 4-5를 참고하기 바란다.

소스 4-5 IppDib 클래스 - 비트맵 화면 출력(IppDib.cpp)
void IppDib::Draw(HDC hdc, int dx, int dy)
{
    if (m_pDib == NULL)
        return;

    LPBITMAPINFO lpbi = (LPBITMAPINFO)m_pDib;
    LPVOID lpBits = (LPVOID)GetDIBitsAddr();

    ::SetDIBitsToDevice(hdc, // hdc
        dx,                  // DestX
        dy,                  // DestY
        m_nWidth,            // nSrcWidth
        m_nHeight,           // nSrcHeight
        0,                   // SrcX
        0,                   // SrcY
        0,                   // nStartScan
        m_nHeight,           // nNumScans
        lpBits,              // lpBits
        lpbi,                // lpBitsInfo
        DIB_RGB_COLORS);     // wUsage
}

void IppDib::Draw(HDC hdc, int dx, int dy, int dw, int dh, DWORD dwRop)
{
    Draw(hdc, dx, dy, dw, dh, 0, 0, m_nWidth, m_nHeight, dwRop);
}

void IppDib::Draw(HDC hdc, int dx, int dy, int dw, int dh,
    int sx, int sy, int sw, int sh, DWORD dwRop)
{
    if (m_pDib == NULL)
        return;

    LPBITMAPINFO lpbi = (LPBITMAPINFO)m_pDib;
    LPSTR lpDIBBits = (LPSTR)GetDIBitsAddr();

    SetStretchBltMode(hdc, COLORONCOLOR);
    ::StretchDIBits(hdc, // hdc
        dx,              // XDest
        dy,              // YDest
        dw,              // nDestWidth
        dh,              // nDestHeight
        sx,              // XSrc
        sy,              // YSrc
        sw,              // nSrcWidth
        sh,              // nSrcHeight
        lpDIBBits,       // lpBits
        lpbi,            // lpBitsInfo
        DIB_RGB_COLORS,  // wUsage
        SRCCOPY);        // dwROP
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.