더북(TheBook)

지금까지 설명한 수정 사항들을 소스 5-17에 정리하여 나타내었다.

소스 5-17 영상 확대하여 보기 코드 구현(ImageToolView.cpp)
CImageToolView::CImageToolView()
    : m_nZoom(1)
{

}

void CImageToolView::OnDraw(CDC* pDC)
{
    CImageToolDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    if (pDoc->m_Dib.IsValid())
    {
        int w = pDoc->m_Dib.GetWidth();
        int h = pDoc->m_Dib.GetHeight();
        pDoc->m_Dib.Draw(pDC->m_hDC, 0, 0, w * m_nZoom, h * m_nZoom);
    }
}

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

    SetScrollSizeToFit();
}

void CImageToolView::SetScrollSizeToFit(void)
{
    CSize sizeTotal;

    CImageToolDoc* pDoc = GetDocument();
    if (pDoc->m_Dib.IsValid())
    {
        int w = pDoc->m_Dib.GetWidth();
        int h = pDoc->m_Dib.GetHeight();

        sizeTotal.cx = w * m_nZoom;
        sizeTotal.cy = h * m_nZoom;
    }
    else
    {
        sizeTotal.cx = sizeTotal.cy = 100;
    }

    SetScrollSizes(MM_TEXT, sizeTotal);

    ResizeParentToFit(TRUE);
}

소스 5-17에서 가장 큰 변화가 생긴 부분은 OnInitialUpdate 함수이다. 원래 OnInitialUpdate 함수 내부에 작성되어 있던 스크롤바 관련 코드를 SetScrollSizeToFit라는 이름의 새로운 멤버 함수로 모두 옮기고, 해당 함수를 호출하는 형태로 코드를 변경하였다. 이러한 작업도 리팩토링의 일종인데, 아쉽게도 Visual Studio 2015에서는 이러한 함수 추출과 관련된 리팩토링 기능은 지원하지 않는다. 그러므로 여러분이 직접 수작업으로 편집해주어야 한다. SetScrollSizeToFit 함수를 사용하기 위해 ImageToolView.h 파일에 아래와 같은 멤버 함수 선언이 한 줄 추가되어야 한다.

void SetScrollSizeToFit();

이처럼 스크롤 관련 코드를 새로운 함수로 만들어준 이유는 사용자가 확대 배율을 변경할 때마다 스크롤 정보를 변경해야 하기 때문이다. SetScrollSizeToFit 안에서는 다음과 같은 코드를 사용하여 스크롤바의 정보를 설정하고 있음을 확인할 수 있다.

sizeTotal.cx = w * m_nZoom;
sizeTotal.cy = h * m_nZoom;
SetScrollSizes(MM_TEXT, sizeTotal);
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.