더북(TheBook)

이제 기본으로 제공되는 OnInitialUpdate 함수를 수정하여 영상의 크기에 맞게 스크롤바가 나타나도록 해보자. 소스 5-5는 수정된 OnInitialUpdate 함수를 보여준다.

소스 5-5 창 크기를 영상의 크기에 맞추기(ImageToolView.cpp)
void CImageToolView::OnInitialUpdate()
{
    CScrollView::OnInitialUpdate();

    CSize sizeTotal;
    CImageToolDoc* pDoc = GetDocument();
    if (pDoc->m_Dib.IsValid())
    {
        sizeTotal.cx = pDoc->m_Dib.GetWidth();
        sizeTotal.cy = pDoc->m_Dib.GetHeight();
    }
    else
    {
        sizeTotal.cx = sizeTotal.cy = 100;
    }

    SetScrollSizes(MM_TEXT, sizeTotal);

    ResizeParentToFit(TRUE);
}

수정된 OnInitialUpdate 함수에서는 일단 GetDocument 함수를 이용하여 CImageToolDoc 클래스의 포인터를 받아 왔다. 그리고 CImageToolDoc 클래스의 멤버 변수 m_Dib로부터 GetWidthGetHeight 함수를 호출하여 영상의 가로 크기와 세로 크기를 알아내어 sizeTotal 변수 값을 설정하였다. 만약 도큐먼트 클래스의 m_Dib 비트맵이 정상적으로 생성되지 않았다면 sizeTotal.cxsizeTotal.cy 값은 원래 코드와 동일하게 100으로 설정하였다.

소스 5-5의 맨 마지막 줄에 보면 새롭게 ResizeParentToFit 함수가 추가된 것을 볼 수 있다. ResizeParentToFit 함수는 CScrollView 클래스의 멤버 함수로써 차일드 프레임의 크기를 뷰의 크기에 맞춰 주는 작업을 수행한다. ResizeParentToFit 함수의 원형은 다음과 같다.

void ResizeParentToFit(
    BOOL bShrinkOnly = TRUE
);

ResizeParentToFit 함수는 BOOL 타입의 인자를 하나 받는데, 이 값이 TRUE이면 불러온 영상의 크기가 차일드 프레임보다 작은 경우에만 프레임의 크기를 영상의 크기에 맞추어준다. 영상의 크기가 프레임보다 큰 경우에는 프레임 크기에 변화가 없다. 만약 FALSE를 지정하면, 영상의 크기가 매우 커서 한 화면에 나타날 수 없는 상황에서도 프레임 창의 크기를 키우기 때문에 보기 좋지 않은 모양이 될 수 있다. 그러므로 가급적이면 TRUE 인자를 주는 것이 좋으며, 인자를 주지 않을 경우 기본적으로 TRUE로 지정된다.

그림 5-17은 OnInitialUpdate 함수를 수정한 후 ImageTool 프로그램을 실행한 화면이다. mandrill.bmp와 lenna.bmp 파일을 각각 열어 보면 영상의 크기에 맞게 차일드 프레임의 크기가 자동으로 조절되어 있는 것을 볼 수 있을 것이다. 그림 5-17에서 mandrill.bmp 창은 마우스를 이용하여 차일드 프레임의 크기를 조금 작게 조절한 경우인데, 자동으로 스크롤바가 생기는 것도 확인할 수 있다.

그림 5-17 ImageTool 프로그램에서 창 크기를 영상 크기에 맞추기
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.