더북(TheBook)

다음으로 IppDib 클래스에 필요한 멤버 함수들에 대해 생각해보자. 앞서 4.1절에서도 언급했듯이 IppDib 클래스는 비트맵 생성과 소멸, BMP 파일 입출력, 비트맵 화면 출력, 클립보드 기능 등을 지원할 것이다. 그러므로 이런 기능들을 지원할 멤버 함수들이 존재해야 하며, 추가적으로 IppDib 클래스를 편리하게 사용할 수 있는 기능들도 만들 것이다. 예를 들어 복사 생성자, 연산자 재정의 등을 통해 IppDib 클래스를 안전하고 사용하기 편리하도록 설계할 것이다. 이러한 기능들을 감안하여 설계한 IppDib 클래스의 정의를 소스 4-1에 나타내었다. 각각의 멤버 함수 구현에 대해서는 이제부터 차근차근 설명할 것이다.

소스 4-1 IppDib 클래스 정의(IppDib.h)
#pragma once

#include <windows.h>

class IppDib
{
public:
    // 생성자와 소멸자
    IppDib();
    IppDib(const IppDib& dib);
    ~IppDib();

    // 비트맵 생성과 소멸
    BOOL CreateGrayBitmap(LONG nWidth, LONG nHeight);
    BOOL CreateRgbBitmap(LONG nWidth, LONG nHeight);
    void DestroyBitmap();

    // 파일 입출력
    BOOL Load(const char* filename);
    BOOL Save(const char* filename);

    // 비트맵 화면 출력
    void Draw(HDC hdc, int dx = 0, int dy = 0);
    void Draw(HDC hdc, int dx, int dy, int dw, int dh, DWORD dwRop = SRCCOPY);
    void Draw(HDC hdc, int dx, int dy, int dw, int dh, int sx, int sy, int sw,
        int sh, DWORD dwRop = SRCCOPY);

    // Windows 환경에서 클립보드로 복사하기 및 붙여넣기
    BOOL CopyToClipboard();
    BOOL PasteFromClipboard();

    // 대입 연산자 재정의와 비트맵 복사
    IppDib& operator=(const IppDib& dib);
    void Copy(IppDib* pImage);

    // 비트맵 정보 반환 함수
    LONG         GetHeight()         const { return m_nHeight; }
    LONG         GetWidth()          const { return m_nWidth; }
    WORD         GetBitCount()       const { return m_nBitCount; }
    DWORD        GetDibSize()        const { return m_nDibSize; }
    LPBITMAPINFO GetBitmapInfoAddr() const { return (LPBITMAPINFO)m_pDib; }
    BYTE*        GetDIBitsAddr() const;
    int          GetPaletteNums() const;
    BOOL         IsValid() const { return (m_pDib != NULL); }

private:
    // BMP 파일 입출력
    BOOL LoadBMP(const char* filename);
    BOOL SaveBMP(const char* filename);

private:
    LONG m_nWidth;    // 비트맵 가로 크기(픽셀 단위)
    LONG m_nHeight;   // 비트맵 세로 크기(픽셀 단위)
    WORD m_nBitCount; // 픽셀 당 비트 수
    DWORD m_nDibSize; // DIB 전체 크기(BITMAPINFOHEADER + 색상 테이블 + 픽셀 데이터)
    BYTE* m_pDib;     // DIB 시작 주소(BITMAPINFOHEADER 시작 주소)
};
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.