더북(TheBook)

메뉴 항목을 선택적으로 비활성화시키거나 메뉴 항목 이름 앞에 체크 표시를 추가하는 등의 작업은 UPDATE_COMMAND_UI 메시지 형식에 대한 이벤트 처리기에서 수행한다. 즉, [붙여넣기] 메뉴 항목이 보여지는 방법을 제어하려면 OnUpdateEditPaste 함수에 관련 코드를 추가해야 한다. 클립 보드에 있는 데이터가 DIB 데이터인 경우에만 [붙여넣기] 메뉴 항목을 활성화시키는 코드는 소스 5-16에 나타내었다.

소스 5-16 [붙여넣기] 메뉴 이벤트 처리 함수 - OnUpdateEditPaste(ImageTool.cpp)
void CImageToolApp::OnUpdateEditPaste(CCmdUI *pCmdUI)
{
    pCmdUI->Enable(IsClipboardFormatAvailable(CF_DIB));
}

OnUpdateEditPaste 함수에서 호출되는 IsClipboardFormatAvailable 함수는 Windows API 함수로써 클립 보드에 존재하는 데이터의 형식에 대한 조사를 수행한다. 이 함수의 인자로 CF_DIB를 넘겨주면 클립 보드에 들어 있는 데이터의 형식이 DIB 형식인 경우에 TRUE를 반환하고 그렇지 않은 경우에는 FALSE를 반환한다. OnUpdateEditPaste 함수의 인자로 전달되는 CCmdUI 클래스는 메뉴 혹은 툴바의 상태를 제어하는 클래스이며, Enable 함수는 해당 메뉴 항목을 활성화 또는 비활성화시키는 동작을 담당한다. 즉, OnUpdateEditPaste 함수는 클립 보드의 데이터가 DIB 형식인 경우에만 [붙여넣기] 메뉴 항목을 활성화시키고, 그렇지 않은 경우에는 [붙여넣기] 메뉴를 선택조차 할 수 없게끔 비활성화시킨다.

이로써 복사 및 붙여넣기 기능 구현이 완료되었다. 이제 다른 영상 편집 프로그램에서 영상을 복사하여 ImageTool 프로그램에 붙여넣기를 수행할 수 있을 것이다. 그림 5-39는 Windows 보조프로그램에 들어있는 그림판 프로그램에서 boys.jpg 파일을 열어서 복사한 뒤, ImageTool 프로그램에서 [붙여넣기] 메뉴를 실행한 결과 화면이다. 굳이 boys.jpg 파일을 BMP 파일로 저장하지 않아도 ImageTool 프로그램에서 해당 파일을 쉽게 화면에 띄울 수 있게 되었다. 또한 ImageTool에서 생성된 영상 처리 결과 영상을 복사하여 다른 영상 편집 프로그램이나 Microsoft Word 같은 문서 편집기로도 쉽게 공유할 수 있을 것이다.

그림 5-39 그림판에서 불러온 영상을 ImageTool로 복사 & 붙여넣기를 실행한 화면
Note | IDR_MAINFRAME 메뉴에 [붙여넣기] 메뉴 항목 추가하기

ImageTool 프로그램을 실행하자마자 ImageTool 메뉴를 살펴보면 [편집] 메뉴가 아예 존재하지 않는 것을 발견할 수 있다. 이는 ImageTool 프로그램 실행 후 처음에는 차일드 윈도우가 하나도 존재하지 않기 때문에 IDR_ImageToolTYPE 메뉴 대신에 IDR_MAINFRAME 메뉴가 사용되기 때문이다. 즉, IDR_ImageToolTYPE 메뉴에는 기본적으로 [편집] 메뉴가 존재하지만, IDR_MAINFRAME 메뉴에는 아쉽게도 [편집] 메뉴가 존재하지 않는다. 도큐먼트가 하나도 없는 상태이기 때문에 [복사] 메뉴는 없는 것이 당연하지만, [붙여넣기] 기능은 차일드 윈도우가 없을 때에도 동작해야 맞는 것 같다. 그러므로 IDR_MAINFRAME 메뉴에도 [붙여넣기] 메뉴는 만들어주는 것이 바람직하다. IDR_MAINFRAME 메뉴에 [붙여넣기] 메뉴 항목을 추가하는 방법을 자세히 설명하지는 않을 것이지만, 이 책에서 제공되는 ImageTool 소스 코드에는 IDR_MAINFRAME 메뉴에도 [붙여넣기] 항목을 추가하였으니 소스 코드를 참고하기 바란다.

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