7.3.4 산술 및 논리 연산 메뉴 및 메뉴 이벤트 추가

    ImageTool 프로그램에 산술 및 논리 연산을 위한 메뉴 항목과 메뉴 이벤트 처리 함수를 추가해보자. Visual Studio 리소스 뷰에서 IDR_ImageToolTYPE 항목을 더블 클릭하여 메뉴 편집 창에 나타나게 한 후, 그림 7-14와 같이 [산술 및 논리 연산] 메뉴 항목을 추가하자. [산술 및 논리 연산] 메뉴 항목의 속성은 표 7-6을 참고하라. 그림 7-14에서 기존 메뉴와 차별을 두기 위하여 [산술 및 논리 연산] 메뉴 위에 구분선을 추가한 것을 볼 수 있다.

    그림 7-14 [산술 및 논리 연산] 메뉴 항목 추가
    표 7-6 [산술 및 논리 연산] 메뉴 항목 속성

    ID

    Caption

    ID_ARITHMETIC_LOGICAL

    산술 및 논리 연산(&A)...

    메뉴 항목을 추가하였으면, 이제 이 메뉴에 대한 메뉴 이벤트 처리 함수를 추가하자. [산술 및 논리 연산] 메뉴 항목에 대한 이벤트 처리기 마법사에 입력할 정보는 표 7-7을 참고하라. 메뉴 이벤트 처리 함수 OnArithmeticLogical에 추가할 소스 코드는 소스 7-12에 나타내었다.

    표 7-7 [산술 및 논리 연산] 메뉴 이벤트 처리기 정보

    명령 이름(ID)

    처리 클래스

    메시지 형식

    처리기 이름

    ID_ARITHMETIC_LOGICAL

    CImageToolDoc

    COMMAND

    OnArithmeticLogical

    소스 7-12 [산술 및 논리 연산] 메뉴 이벤트 처리 함수(ImageToolDoc.cpp)
    #include "ArithmeticLogicalDlg.h"
    
    void CImageToolDoc::OnArithmeticLogical()
    {
        CArithmeticLogicalDlg dlg;
        if (dlg.DoModal() == IDOK)
        {
            CImageToolDoc* pDoc1 = (CImageToolDoc*)dlg.m_pDoc1;
            CImageToolDoc* pDoc2 = (CImageToolDoc*)dlg.m_pDoc2;
    
            CONVERT_DIB_TO_BYTEIMAGE(pDoc1->m_Dib, img1)
            CONVERT_DIB_TO_BYTEIMAGE(pDoc2->m_Dib, img2)
            IppByteImage img3;
    
            bool ret = false;
    
            switch (dlg.m_nFunction)
            {
            case 0: ret = IppAdd(img1, img2, img3);  break;
            case 1: ret = IppSub(img1, img2, img3);  break;
            case 2: ret = IppAve(img1, img2, img3);  break;
            case 3: ret = IppDiff(img1, img2, img3); break;
            case 4: ret = IppAND(img1, img2, img3);  break;
            case 5: ret = IppOR(img1, img2, img3);   break;
            }
    
            if (ret)
            {
                CONVERT_IMAGE_TO_DIB(img3, dib)
    
                TCHAR* op[] = { _T("덧셈"), _T("뺄셈"), _T("평균"), _T("차이"), _T("논리 AND"),
                    _T("논리 OR") };
                AfxPrintInfo(_T("[산술 및 논리 연산] [%s] 입력 영상 #1: %s, 입력 영상 #2: %s"),
                    op[dlg.m_nFunction], pDoc1->GetTitle(), pDoc2->GetTitle());
                AfxNewBitmap(dib);
            }
            else
                AfxMessageBox(_T("영상의 크기가 다릅니다!"));
        }
    }
    

    OnArithmeticLogical 함수는 6장에서 만들었던 메뉴 이벤트 처리 함수들보다 내용이 상당히 긴 편이다. 아무래도 이 함수 내에서 모든 산술 및 논리 연산을 처리하기 때문이다. OnArithmeticLogical 함수의 첫 부분에서는 DoModal 함수를 이용하여 산술 및 논리 연산 대화 상자를 띄운다. 대화 상자에서 사용자가 [확인] 버튼을 클릭하면 if 문 블록 안의 코드가 수행된다.

    if 문 안에서는 CArithmeticLogicalDlg 클래스의 멤버 변수 m_pDoc1m_pDoc2에 저장되어 있는 도큐먼트의 포인터를 CImageToolDoc* 타입으로 형변환하여 받아 온다. 그리고 각각의 도큐먼트에 포함된 m_Dib 비트맵 영상을 CONVERT_DIB_TO_BYTEIMAGE 매크로 함수를 이용하여 각각 img1img2로 변환한다. 이 두 영상은 앞에서 구현한 산술 및 논리 연산 함수의 인자로 사용될 것이다.

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