더북(TheBook)

5.5.1 영상 정보 출력창 구성

영상 처리 프로그램을 만들다 보면 영상 처리 결과를 영상으로만 보여주는 것이 아니라 문자열 형태로 보여줘야 하는 경우가 있다. 이런 경우에 요긴하게 사용할 수 있도록 프로그램에 문자열 출력창이 있으면 좋을 것 같다. Visual Studio 2008 이전에는 MFC 응용 프로그램에 문자열 출력창을 추가하는 것이 그리 쉬운 작업은 아니었다. 그러나 Visual Studio 최신 버전에서는 프로젝트 생성 시 스타일을 ‘Visual Studio’로 설정하면 마우스 클릭만으로 출력창을 추가할 수 있다.

처음에 ImageTool 프로젝트를 생성할 때, MFC 응용 프로그램 마법사에서 출력창 옵션을 체크하였기 때문에 ImageTool 프로그램도 그림 5-47과 같은 출력창이 붙어 있다. 이 출력창은 ImageTool 프로그램의 메인 프레임 윈도우 하단에 도킹docking되어 있고, 사용자가 원한다면 메인 프레임에서 떼어내거나 또는 안 보이게 감출 수도 있다. 출력창 안에는 빌드, 디버그, 찾기 탭이 있으며 각각의 탭에는 나름의 문자열이 출력되어 있다. 기본적으로 출력창에서 마우스 오른쪽 버튼을 눌렀을 때 [복사], [지우기], [숨기기] 등의 컨텍스트 메뉴도 나타나는데, [복사], [지우기] 메뉴는 선택하면 단순히 메시지 박스만 출력된다. 이 출력창을 응용해서 여기에 영상 처리 정보를 문자열로 출력하는 용도로 사용하려고 한다. 소스 코드를 최대한 단순화시키기 위해 3개의 탭 중 2개는 삭제할 것이며, 더불어 탭 모양의 인터페이스도 굳이 필요 없으니 삭제할 것이다. 이를 위해 일단 MFC 응용 프로그램 마법사가 만들어준 기본 출력창 코드에 대한 분석이 필요하다.

그림 5-47 기본 출력창의 구성

출력창은 메뉴바, 툴바, 상태바와 더불어 메인 프레임 윈도우에 붙어 있다. 그러므로 출력창을 생성시키고 메인 프레임에 붙이는 코드는 CMainFrame 클래스에서 찾을 수 있다. 일단 MainFrm.h 파일을 열어서 CMainFrame 클래스 정의를 살펴보면 아래와 같은 코드를 발견할 수 있다.

protected: // 컨트롤 모음이 포함된 멤버입니다.
    CMFCMenuBar    m_wndMenuBar;
    CMFCToolBar    m_wndToolBar;
    CMFCStatusBa   m_wndStatusBar;
    COutputWnd     m_wndOutput;

멤버 변수 이름을 보면 쉽게 알 수 있듯이, 위 네 개의 멤버 변수는 각각 메뉴바, 툴바, 상태바, 출력창을 표현하는 객체이다. 이중 m_wndMenuBar, m_wndToolBar, m_wndStatusBarCMainFrame의 멤버 함수인 OnCreate에서 생성되고, m_wndOutputCreateDockingWindows 멤버 함수에서 생성된다. CreateDockingWindows 함수에서는 단순히 m_wndOutput.Create() 함수를 호출하여 윈도우를 생성할 뿐이며, 출력창 내부에 있는 빌드, 디버그, 찾기 탭은 COutputWnd 클래스 내부에서 자체적으로 만들어지게 된다. 즉, 출력창 내부의 탭 구성을 변경하는 작업은 오직 COutputWnd 클래스만 수정하면 되고, CMainFrame 클래스의 코드는 변경할 필요가 없다. 그러므로 COutputWnd 클래스 분석으로 넘어가보자.

OutputWnd.h 파일을 열어서 COutputWnd 클래스 정의를 살펴보자. COutputWnd 클래스는 CDockablePane 클래스를 상속받아 만들어진 윈도우이고, CDockablePane 클래스는 메인 프레임 윈도우에 도킹할 수 있는 기능을 가진 윈도우 클래스이다. COutputWnd 클래스의 멤버 변수 선언 코드를 살펴보면 아래와 같다.

class COutputWnd : public CDockablePane
{
...
protected:
    CMFCTabCtrl m_wndTabs;

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