더북(TheBook)

마지막으로 출력창과 관련하여 한 가지만 더 코드를 수정해보자. 현재 출력창 위에서 마우스 오른쪽 버튼을 클릭하면 [복사], [지우기], [숨기기] 등의 메뉴가 나타나는데, 이 중 제대로 동작하는 기능은 [숨기기] 하나뿐이다. [복사] 또는 [지우기] 메뉴를 선택하면 단순히 메시지 박스만을 보여줄 뿐이다. 기왕 컨텍스트 메뉴가 나타나고 있으니 이 메뉴 이벤트 처리기 함수를 보완하여 실제로 복사 또는 지우기 기능이 동작하도록 수정해보자.

출력창에서 마우스 오른쪽 버튼을 누를 때 컨텍스트 메뉴를 보여주는 코드는 COutputList 클래스에 정의되어 있다. COutputList 클래스의 멤버 함수 정의는 OutputWnd.cpp 파일에서 찾을 수 있다. 이 중 [복사] 또는 [지우기] 메뉴 항목 선택에 대한 이벤트 처리기 함수는 이미 OnEditCopyOnEditClear라는 이름으로 만들어져 있다. 이 두 함수는 기본적으로 메시지 박스를 출력하는 함수 호출 한 줄로만 정의되어 있는데, 이 코드를 소스 5-25와 같이 수정하자.

소스 5-25 출력창의 [복사], [지우기] 메뉴 이벤트 처리 함수(OutputWnd.cpp)
void COutputList::OnEditCopy()
{
    int nIndex = GetCurSel();
    if (nIndex == LB_ERR)
        return;

    CString message;
    GetText(nIndex, message);

    size_t nLength = (message.GetLength() + 1) * sizeof(TCHAR);
    HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE, nLength);
    memcpy_s(GlobalLock(hData), nLength, message.LockBuffer(), nLength);
    GlobalUnlock(hData);
    message.UnlockBuffer();

    if (OpenClipboard())
    {
        EmptyClipboard();
        SetClipboardData(CF_UNICODETEXT, hData);
        CloseClipboard();
    }
}
void COutputList::OnEditClear()
{
    ResetContent();
}

OnEditCopy() 함수에 추가된 코드는 리스트 박스에서 현재 선택된 문자열을 클립보드로 복사하는 코드이며, 이에 대한 자세한 설명은 생략하겠다. OnEditClear() 함수에서는 CListBox 클래스의 멤버 함수인 ResetContent() 함수를 호출하여 리스트 박스 내부의 모든 문자열을 지우는 동작을 담당한다. 소스 5-25와 같이 코드를 수정한 후, ImageTool 프로그램을 실행하여 [복사]와 [지우기] 메뉴가 정상적으로 동작하는지 확인해보기 바란다.

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