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을 참고하라.
자, 이제 프로그램 어디에서든 다음과 같이 코드를 입력하여 출력창에 문자열을 나타낼 수 있다.
CMainFrame* pFrame = (CMainFrame*) AfxGetMainWnd(); pFrame->m_wndOutput.AddString(_T("출력창에 문자열이 추가됩니다."));