더북(TheBook)

도큐먼트 템플릿은 2.3절에서 CFirstApp 클래스의 멤버 함수인 InitInstance 함수를 설명할 때 언급한 적이 있다. 도큐먼트 템플릿은 사용할 리소스의 아이디, 도큐먼트 클래스의 이름, 프레임 클래스의 이름, 뷰 클래스의 이름 정보를 이용하여 생성된다. 그리고 AddDocTemplate 함수를 통하여 CImageToolApp 클래스에 등록된다. CImageToolApp 클래스의 InitInstance 함수를 보면 중간쯤에 다음과 같은 코드를 찾을 수 있다.

// 응용 프로그램의 문서 템플릿을 등록합니다. 문서 템플릿은
// 문서, 프레임 창 및 뷰 사이의 연결 역할을 합니다.
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_ImageToolTYPE,
    RUNTIME_CLASS(CImageToolDoc),
    RUNTIME_CLASS(CChildFrame), // 사용자 지정 MDI 자식 프레임입니다.
    RUNTIME_CLASS(CImageToolView));
if (!pDocTemplate)
    return FALSE;
AddDocTemplate(pDocTemplate);

위 코드에서 CMultiDocTemplate 클래스가 다중 문서 인터페이스를 사용하는 프로그램에서 도큐먼트 템플릿을 관리하는 클래스이다. 만약 단일 문서 인터페이스를 사용하는 경우에는 CSingleDocTemplate 클래스가 도큐먼트 템플릿을 관리하기 위해 사용된다. 참고로 CMultiDocTemplate 클래스와 CSingleDocTemplate 클래스는 CDocTemplate이라는 공통의 부모 클래스를 갖는다. 위 코드에서 새로운 도큐먼트 템플릿이 new 연산자에 의해 동적 생성된 후, AddDocTemplate 함수에 의해 추가되는 것을 볼 수 있다.

그렇다면 이 도큐먼트 템플릿을 얻어 오려면 어떻게 해야 할까? MFC 프로그래밍에서는 CWinApp 클래스의 멤버 함수인 GetFirstDocTemplatePosition 함수와 GetNextDocTemplate 함수를 조합하여 도큐먼트 템플릿을 받아올 수 있다. 이처럼 두 함수를 조합하여 사용해야 하는 이유는 그림 7-10에서 나타낸 것과 같이 CImageToolApp 클래스가 여러 개의 도큐먼트 템플릿을 가질 수 있기 때문이다. 그러나 여기서는 약간의 편법을 써서 좀 더 간단하게 도큐먼트 템플릿에 접근하는 방법을 설명하겠다.

위의 InitInstance 함수에서 도큐먼트 템플릿을 동적 생성하여 지역 변수인 pDocTemplate에 할당하였다. 그러나 이처럼 동적 생성한 도큐먼트 템플릿을 반드시 지역 변수에 할당할 필요는 없다. 만약 도큐먼트 템플릿을 자주 사용할 필요가 있다면, 동적 생성한 도큐먼트 템플릿을 지역 변수가 아닌 멤버 변수로 가지고 있는 것이 유리하다. 즉, CImageToolApp 클래스에 CMultiDocTemplate* 타입의 멤버 변수 m_pImageDocTemplate를 추가하고, 이 변수에 동적 생성한 도큐먼트 템플릿의 포인터를 저장해두는 방법을 사용하면 추후 간단하게 도큐먼트 템플릿에 접근할 수 있다. 소스 7-7은 CImageToolApp 클래스에 CMultiDocTemplate* 타입의 멤버 변수 m_pImageDocTemplate을 추가한 것을 보여준다.

소스 7-7 도큐먼트 템플릿을 CImageToolApp 클래스의 멤버 변수로 선언(ImageTool.h)
class CImageToolApp : public CWinAppEx
{
…
public:
    IppDib* m_pNewDib;
    CMultiDocTemplate* m_pImageDocTemplate;
…
};
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.