더북(TheBook)

5.1.6 창 크기를 영상의 크기에 맞추기

앞에서 BMP 파일을 불러와 화면에 출력하는 방법을 설명하였다. 그런데 차일드 프레임의 기본 크기가 영상의 크기보다 훨씬 더 커서 영상 바깥에 흰 배경이 함께 표시되고 있어서 뭔가 깔끔하지 않은 모양새이다. 이는 차일드 프레임이 실제 뷰 영역에서 사용되는 영역을 제대로 알고 있지 못하기 때문이다. 그러므로 이번에는 차일드 프레임 크기를 실제 비트맵 크기에 맞게 설정하는 방법에 대해 알아보자.

처음에 ImageTool 프로젝트를 생성할 때 MFC 응용 프로그램 마법사에서 CImageToolView 클래스의 기본 클래스를 CScrollView 클래스로 지정하였다. CImageToolView 클래스는 CScrollView 클래스를 상속받아 만들었기 때문에 스크롤 관련 기능을 쉽게 처리할 수 있다. 즉, 영상이 뷰 영역의 크기보다 큰 경우 자동으로 스크롤바를 나타내어 주고, 마우스를 이용하여 간단하게 스크롤 기능을 제어할 수 있게 해준다. 다만 영상이 화면에 나타나기 이전에 뷰 클래스에게 영상의 가로 및 세로 크기를 알려주어야 한다. 그래야만 CImageToolView 클래스가 스크롤바를 만들어야 할 상황인지 아닌지를 가늠할 수 있다.

그렇다면 뷰 클래스에게 영상의 크기 정보는 언제, 어디서, 어떻게 알려주어야 할까? 일반적으로 뷰 클래스에서는 OnInitialUpdate라는 이름의 함수가 초기화 작업을 담당한다. OnInitialUpdate 함수는 CView 클래스에 정의된 가상 함수로써 도큐먼트 객체가 생성되어 뷰가 화면에 나타나기 직전에 자동으로 호출되는 함수이다. 그러므로 OnInitialUpdate 함수에서 영상의 크기 정보를 설정해주는 것이 바람직하다.

MFC 응용 프로그램 마법사에서 새로 만드는 뷰 클래스의 상위 클래스를 CScrollView 클래스로 지정하였을 경우, OnInitialUpdate 함수가 자동으로 재정의되어 만들어진다. CImageToolView 클래스에도 OnInitialUpdate 함수가 아래와 같은 형태로 정의되어 있다.

void CImageToolView::OnInitialUpdate()
{
    CScrollView::OnInitialUpdate();

    CSize sizeTotal;
    // TODO: 이 뷰의 전체 크기를 계산합니다.
    sizeTotal.cx = sizeTotal.cy = 100;
    SetScrollSizes(MM_TEXT, sizeTotal);
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.