더북(TheBook)

5.5.2 출력창에 영상 정보 표시하기

일단 앞에서 COutputWnd 클래스에 AddString이라는 함수를 만들어 놓았기 때문에 이 함수를 이용하면 출력창에 문자열을 쓰는 것은 가능한 상황이다. 다만 CImageToolDoc 또는 CImageToolView 같은 외부 클래스에서 실제로 AddString 함수를 호출할 수 있도록 만들기 위해서는 추가적인 작업을 수행해주어야 한다.

일단 CImageToolDoc 또는 CImageToolView 같은 외부 클래스에서 CMainFrame 클래스의 멤버 변수인 m_wndOutput에 접근하는 것부터 확인해보자. 메인 프레임 윈도우의 주소를 얻으려면 AfxGetMainWnd()라는 전역 함수를 호출하면 된다. 즉, ImageTool 프로젝트 어느 소스에서든 아래와 같이 코드를 작성하면 CMainFrame* 주소를 얻을 수 있다.

CMainFrame* pFrame = (CMainFrame*) AfxGetMainWnd();

메인 프레임 윈도우의 포인터를 얻었으니 CMainFrame 클래스의 멤버 변수 m_wndOutput을 참조할 수 있고, m_wndOutput으로부터 AddString() 함수를 호출하는 코드를 만들 수 있다.

CMainFrame* pFrame = (CMainFrame*) AfxGetMainWnd();
pFrame->m_wndOutput.AddString(_T("출력창에 문자열이 추가됩니다."));

그러나 위와 같이 코드를 입력하고 프로젝트를 빌드해보면 아래와 같은 에러가 발생한다.

error C2248: 'CMainFrame::m_wndOutput' : protected 멤버('CMainFrame' 클래스에서 선언)에 액세스할 수 없습니다.

에러 메시지에서 쉽게 파악할 수 있듯이, m_wndOutput 멤버 변수의 접근 지시자가 public이 아니라 protected라서 외부 클래스에서는 m_wndOutput에 접근할 수가 없다. MFC 응용 프로그램 마법사가 코드를 생성해줄 때, 은닉화encapsulation의 일환으로 CMainFrame 클래스의 멤버 변수들을 protected로 선언해놓은 것이다. 이 문제를 해결하기 위해 m_wndOutput 멤버 변수의 참조 또는 포인터를 반환하는 public 멤버 함수를 새로 만들 수도 있지만, 여기서는 코딩의 단순화를 위해 이 멤버 변수들의 접근 지시자를 모두 public으로 변경하여 사용하도록 하자. 소스 5-21을 참고하라.

소스 5-21 CMainFrame 클래스에서 출력창 멤버 변수의 접근 지시자 변경(MainFrm.h)
class CMainFrame : public CMDIFrameWndEx
{
    …
public: // 컨트롤 모음이 포함된 멤버입니다.
    CMFCMenuBar      m_wndMenuBar;
    CMFCToolBar      m_wndToolBar;
    CMFCStatusBar    m_wndStatusBar;
    COutputWnd       m_wndOutput;
    …
};

자, 이제 프로그램 어디에서든 다음과 같이 코드를 입력하여 출력창에 문자열을 나타낼 수 있다.

CMainFrame* pFrame = (CMainFrame*) AfxGetMainWnd();
pFrame->m_wndOutput.AddString(_T("출력창에 문자열이 추가됩니다."));
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.