더북(TheBook)

붙여넣기 기능도 일단 [편집] > [붙여넣기] 메뉴 항목에 대한 이벤트 처리기를 추가하는 것부터 시작한다. [붙여넣기] 메뉴에 대한 이벤트 처리기 추가 정보를 표 5-8에 나타내었다. 앞에서 [복사] 메뉴에 대한 이벤트 처리기를 추가한 것과는 꽤 다른 형태임을 볼 수 있다. 일단 이벤트 처리기 함수를 추가할 클래스를 CImageToolDoc 클래스가 아닌 CImageToolApp 클래스로 지정하였다. CImageToolDoc 클래스에 붙여넣기 기능을 추가할 경우, ImageTool 프로그램에 차일드 프레임이 하나도 없는 상태에서는 붙여넣기 기능이 동작하지 않는다. 왜냐하면 CImageToolDoc 클래스의 인스턴스가 존재하지 않기 때문이다. 그러므로 [붙여넣기] 메뉴 항목에 대한 이벤트 처리는 CMainFrame 또는 CImageToolApp 클래스에서 해주어야 하며, 여기서는 CImageToolApp 클래스에 그 기능을 추가하도록 하겠다. 그리고 지금까지는 COMMAND 메시지 형식에 대해서만 이벤트 처리기를 추가하였지만, [붙여넣기] 메뉴에 대해서는 UPDATE_COMMAND_UI 메시지에 대해서도 처리기 함수를 추가하였다. 그래서 두 개의 이벤트 처리 함수, OnEditPasteOnUpdateEditPaste가 추가된다.

표 5-8 [붙여넣기] 메뉴 이벤트 처리기 정보

명령 이름(ID)

처리 클래스

메시지 형식

처리기 이름

ID_EDIT_PASTE

CImageToolApp

COMMAND

OnEditPaste

UPDATE_COMMAND_UI

OnUpdateEditPaste

먼저 [붙여넣기] 메뉴를 선택했을 때 실행되는 OnEditPaste 함수에 대해 알아보자. OnEditPaste 함수에 추가해야 할 소스 코드는 소스 5-15에 나타내었다.

소스 5-15 [붙여넣기] 메뉴 이벤트 처리 함수 - OnEditPaste(ImageTool.cpp)
void CImageToolApp::OnEditPaste()
{
    IppDib dib;
    if (dib.PasteFromClipboard())
        AfxNewBitmap(dib);
}

OnEditPaste 함수에서는 IppDib 클래스 타입의 지역 변수로 dib를 선언하고, IppDib 클래스의 멤버 함수인 PasteFromClipboard 함수를 이용하여 클립보드의 비트맵 영상을 얻어와 새 창으로 나타내고 있다. 이때 dib 영상을 새 창으로 띄우기 위해서 AfxNewBitmap 함수를 사용하는 것을 볼 수 있다.

이로써 붙여넣기 기능은 완성되었지만, 한 가지 더 고려할 사항이 있다. 만약 현재 클립보드에 DIB 영상이 아닌 텍스트 문자열 같은 데이터가 들어가 있다면 어떨까? 이 경우 OnEdgePaste 함수는 아무런 동작을 하지 않고 함수를 종료할 것이다. 그렇다면 클립보드에 DIB 영상이 아닌 데이터가 들어가 있다면 차라리 [붙여넣기] 메뉴 자체를 선택할 수 없도록 만드는 것이 더욱 깔끔할 것 같다.

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