더북(TheBook)

5.1.4 화면 출력 기능 추가하기

앞에서 BMP 파일을 불러오고 저장하는 기능을 추가하였다. 그러나 아직 불러온 그림 파일을 화면에 출력하는 코드를 작성하지 않았기 때문에 프로그램이 정상적으로 동작하고 있는지를 확인하기 어렵다. 그러므로 BMP 파일을 정상적으로 불러온 경우, 비트맵 영상을 화면에 출력하도록 코드를 작성해보자.

2장에서 MFC 프로그램의 모든 화면 출력은 뷰 클래스의 OnDraw 함수에서 담당한다고 설명하였다. 3장과 4장에서 만든 프로그램들은 lenna.bmp 파일을 OnLButtonDown 함수에서 화면 출력하였기 때문에 프로그램이 다른 Windows 응용 프로그램에 의해 가려지거나 윈도우 크기를 변경하면 영상이 사라졌던 것을 기억할 것이다. 이러한 현상을 없애고 정상적으로 영상을 화면에 출력하려면 뷰 클래스의 OnDraw 함수에 그림 그리는 코드를 추가해야 한다. ImageTool 프로젝트에서의 뷰 클래스는 CImageToolView 클래스이다. 그러므로 클래스 뷰에서 CImageToolView 클래스를 선택하고 하단의 멤버 함수 리스트에서 OnDraw 함수를 더블 클릭하자. 그러면 편집 창에 ImageToolView.cpp 파일이 열리면서 OnDraw 함수를 편집할 수 있는 위치로 이동한다.

Visual C++가 만들어준 OnDraw 함수 내부에는 도큐먼트 클래스의 포인터를 받아오는 코드가 기본으로 작성되어 있다.

CImageToolDoc* pDoc = GetDocument();

GetDocument 함수는 해당 뷰 클래스와 연관된 도큐먼트 클래스의 포인터를 반환한다. 일반적으로 OnDraw 함수에서 도큐먼트 클래스의 데이터를 참조하여 화면 출력을 수행하기 때문에 GetDocument 함수 호출이 자동으로 구성되어 있는 것이다. 다시 한 번 강조하면, 도큐먼트 클래스는 데이터의 저장 및 처리를 담당하고 뷰 클래스는 데이터의 표현을 담당한다. 이제 도큐먼트 클래스를 가리키는 포인터 변수 pDoc을 이용하여 CImageToolDoc 클래스의 멤버 변수인 m_Dib 변수에 접근할 수 있다. 여기서 IppDib 클래스의 멤버인 Draw 함수를 호출하여 영상을 화면에 출력할 수 있다. 소스 5-3은 도큐먼트 클래스가 가지고 있는 비트맵을 화면에 출력하는 코드가 추가된 OnDraw 함수 정의를 보여준다.

소스 5-3 비트맵을 화면에 출력하는 OnDraw 함수 구현(ImageToolView.cpp)
void CImageToolView::OnDraw(CDC* pDC)
{
    CImageToolDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
    return;

    if (pDoc->m_Dib.IsValid())
        pDoc->m_Dib.Draw(pDC->m_hDC);
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.