더북(TheBook)

9.2.7 크기 변환 메뉴 만들기

ImageTool 프로그램에 크기 변환을 위한 메뉴 항목과 메뉴 이벤트 처리 함수를 추가해보자. Visual Studio 리소스 뷰에서 IDR_ImageToolTYPE 메뉴 항목을 더블 클릭하여 메뉴 편집 창이 나타나게 한 후, [이미지] 팝업 메뉴 맨 아래에 [크기 변환] 메뉴 항목을 추가하자. [크기 변환] 메뉴 항목의 속성은 표 9-9를 참고하라.

표 9-9 [크기 변환] 메뉴 항목 속성

ID

Caption

ID_IMAGE_RESIZE

크기 변환(&S)...

메뉴 항목을 추가하였으면 이제 이 메뉴에 대한 메뉴 이벤트 처리 함수를 추가하자. [크기 변환] 메뉴 항목에 대한 이벤트 처리기 마법사에 입력할 정보는 표 9-10을 참고하라. OnImageResize 함수에 추가할 소스 코드는 소스 9-8에 나타내었다.

표 9-10 [크기 변환] 메뉴 이벤트 처리기 정보

명령 이름(ID)

처리 클래스

메시지 형식

처리기 이름

ID_IMAGE_RESIZE

CImageToolDoc

COMMAND

OnImageResize

소스 9-8 [크기 변환] 메뉴 이벤트 처리 함수 구현(ImageToolDoc.cpp)
#include "ResizeDlg.h"

void CImageToolDoc::OnImageResize()
{
    CResizeDlg dlg;
    dlg.m_nOldWidth = m_Dib.GetWidth();
    dlg.m_nOldHeight = m_Dib.GetHeight();
    if (dlg.DoModal() == IDOK)
    {
        CONVERT_DIB_TO_BYTEIMAGE(m_Dib, imgSrc)
        IppByteImage imgDst;
        switch (dlg.m_nInterpolation)
        {
        case 0: IppResizeNearest(imgSrc, imgDst, dlg.m_nNewWidth, dlg.m_nNewHeight); break;
        case 1: IppResizeBilinear(imgSrc, imgDst, dlg.m_nNewWidth, dlg.m_nNewHeight); break;
        case 2: IppResizeCubic(imgSrc, imgDst, dlg.m_nNewWidth, dlg.m_nNewHeight); break;
        }

        CONVERT_IMAGE_TO_DIB(imgDst, dib)

        TCHAR* interpolation[] = { _T("최근방 이웃 보간법"), _T("양선형 보간법"), _T("3차 회선 보간법") };
        AfxPrintInfo(_T("[크기 변환] 입력 영상: %s, , 새 가로 크기: %d, 새 세로 크기: %d, 보간법: %s"),
            GetTitle(), dlg.m_nNewWidth, dlg.m_nNewHeight, interpolation[dlg.m_nInterpolation]);
        AfxNewBitmap(dib);
    }
}

OnImageResize 함수의 시작 부분에서 CResizeDlg 클래스의 인스턴스를 하나 선언하고, 그 아래에서 CResizeDlg 클래스의 멤버 변수인 m_nOldWidthm_nOldHeight 값을 설정한 것에 주목하기 바란다. 이 두 멤버 변수의 값은 대화 상자를 화면에 나타나게 하는 DoModal 함수를 호출하기 전에 반드시 설정해주어야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.