더북(TheBook)

4.5.1 IppDib 클래스를 사용하여 BMP 파일 화면 출력하기

이 절에서는 IppDib 클래스를 이용하여 3장에서 만들었던 BmpShow 프로그램과 동일한 동작을 하도록 코드를 작성할 것이다. BmpShow 프로그램은 뷰 영역에서 마우스 왼쪽 버튼을 누르면 해당 위치에 lenna.bmp 파일 비트맵 영상을 그리는 동작을 하였다. 이를 위해 BmpShow에서는 WM_LBUTTONDOWN 윈도우 메시지 처리 함수인 OnLButtonDown을 추가하고, 거기서 BMP 파일 불러오기와 비트맵 화면 출력 코드를 작성하였다. 여기서도 마찬가지로 마우스 왼쪽 버튼 눌림에 대한 이벤트를 처리해야 하므로 일단 OnLButtonDown 함수를 추가해야 한다. OnLButtonDown 함수를 추가하는 방법은 BmpShow 프로그램에서 하였던 것과 동일하므로 설명을 생략하겠다. 잘 기억이 나지 않는 분들은 3.4절에서 ‘BmpShow 프로그램 작성’ 부분을 다시 읽어보기 바란다.

OnLButtonDown 함수를 정상적으로 추가하였다면 이제 함수의 본문을 작성해보자. 여기서 해야 할 일은 두 단계로 나뉘는데, 첫 번째는 BMP 파일을 열어서 DIB 구조를 불러오는 것이다. 이 작업을 앞서 만든 IppDib 클래스를 이용하면 아래와 같이 코드를 작성할 수 있다.

IppDib dib;
dib.Load("lenna.bmp");

IppDib 클래스의 인스턴스로 dib라는 변수를 선언하고, IppDib 클래스의 멤버 함수인 Load 함수를 호출하여 lenna.bmp 파일을 읽는다. BmpShow 프로그램에서 수십 라인으로 만들었던 파일 읽기 코드가 모두 Load 멤버 함수 안으로 이동했기 때문에 OnLButtonDown 함수에서는 위와 같이 매우 간단한 코드만을 추가하면 된다. 다음으로 불러온 비트맵을 화면에 출력하는 코드를 살펴보자.

CClientDC dc(this);
dib.Draw(dc.m_hDC, point.x, point.y);

비트맵 화면 출력 코드도 매우 단순해졌다. CClientDC 클래스를 이용하여 디바이스 컨텍스트를 얻어오는 작업은 BmpShow 프로그램에서와 완전히 동일하다. 다만 BmpShow 프로그램에서는 ::SetDIBitsToDevice 함수에 매우 많은 인자를 넘겨주면서 비트맵을 화면에 출력하였던 것에 반해, IppDib 클래스를 이용하면 매우 단순한 형태의 Draw 멤버 함수 호출만으로 비트맵을 화면에 나타낼 수 있다. 결국 앞에서 IppDib 클래스를 잘 만들어놓았기 때문에 실제 프로그램 작성 시에는 소스 코드가 매우 간단한 형태로 변경되는 것이다. OnLButtonDown 함수의 전체 내용은 소스 4-18에서 확인할 수 있다.

소스 4-18 OnLButtonDown 함수의 수정(IppCreateView.cpp)
#include "IppDib.h"void CBmpShowView::OnLButtonDown(UINT nFlags, CPoint point)
{
    IppDib dib;
    dib.Load("lenna.bmp");

    CClientDC dc(this);
    dib.Draw(dc.m_hDC, point.x, point.y);

    CView::OnLButtonDown(nFlags, point);
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.