일단 CMultiDocTemplate 클래스의 포인터형으로 m_pImageDocTemplate 변수를 추가하였으면, CImageToolApp 클래스의 생성자에서 이를 NULL로 초기화를 해주어야 한다. 그리고 InitInstance 함수에서 pDocTemplate이라는 이름의 지역 변수를 사용하던 부분을 모두 m_pImageDocTemplate 멤버 변수를 사용하는 형태로 변형하자. 소스 7-8에서 강조된 부분을 주의하여 살펴보기 바란다.

    소스 7-8 도큐먼트 템플릿을 CImageToolApp 클래스의 멤버 변수로 관리(ImageTool.cpp)
    CImageToolApp::CImageToolApp()
        : m_pNewDib(NULL), m_pImageDocTemplate(NULL)
    {
    }
    …
    BOOL CImageToolApp::InitInstance()
    {
        // 응용 프로그램의 문서 템플릿을 등록합니다. 문서 템플릿은
        // 문서, 프레임 창 및 뷰 사이의 연결 역할을 합니다.
        CMultiDocTemplate* pDocTemplate;
        m_pImageDocTemplate = new CMultiDocTemplate(IDR_ImageToolTYPE,
            RUNTIME_CLASS(CImageToolDoc),
            RUNTIME_CLASS(CChildFrame), // 사용자 지정 MDI 자식 프레임입니다.
            RUNTIME_CLASS(CImageToolView));
        if (!m_pImageDocTemplate)
            return FALSE;
        AddDocTemplate(m_pImageDocTemplate);
    …
    }
    

    이제 도큐먼트 템플릿을 얻기 위해서는 AfxGetApp 전역 함수를 사용하거나 theApp 전역 변수를 사용하여 CImageToolApp 클래스에 접근한 후, m_pImageDocTemplate 변수를 사용하면 된다.

    이제 간단하게 CImageToolApp 클래스의 도큐먼트 템플릿에 접근할 수 있게 되었다. 도큐먼트 템플릿에는 현재 화면에 떠있는 도큐먼트가 연결 리스트의 형태로 이어져 있다. 그러므로 CDocTemplate 클래스의 멤버 함수인 GetFirstDocPositionGetNextDoc 함수를 조합하여 현재 화면에 떠 있는 도큐먼트에 접근할 수 있다. 아래 소스 코드를 살펴보자.

    CImageToolApp* pApp = (CImageToolApp*)AfxGetApp();
    CImageToolDoc* pDoc = NULL;
    POSITION pos = pApp->m_pImageDocTemplate->GetFirstDocPosition();
    
    while (pos != NULL)
    {
        pDoc = (CImageToolDoc*)pApp->m_pImageDocTemplate->GetNextDoc(pos);
    
        // pDoc을 이용하여 도큐먼트에 접근!!!
    }
    

    위 코드에서 POSITION이라는 타입은 MFC에서 연결 리스트의 위치(주소)를 기억하기 위해 사용되는 타입이다. while 루프는 현재 화면에 떠 있는 모든 창들의 도큐먼트를 검색한 후에 종료된다. 위 코드의 형태를 잘 기억해두기를 바란다. 이 코드는 다음에 설명할 산술 및 논리 연산 대화 상자의 초기화 담당 함수인 OnInitDialog에서 사용될 것이다.

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