더북(TheBook)

일단 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에서 사용될 것이다.

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