프로그램의 뼈대를 이루는 클래스들 간의 상호 참조

1. CWinApp
참조
   
    AfxGetApp
함수는 CWinApp 파생클래스의 인스턴스 포인터를 반환해 준다.
   
    CWinApp* AfxGetApp();
   
2.
메인 프레임 윈도우 참조

    AfxGetMainWnd
함수는 메인 프레임 클래스의 인스턴스 포인터를 반환해 준다.
   
    CWnd* AfxGetMainWnd();
   
3.
뷰에서 프레임 윈도우/다큐먼트 참조

   
뷰에서 다큐먼트 참조
   
    CDocument* CView::GetDocument() const;
   
    GetDocument()
 CView 클래스의 멤버 함수이다.
   
4.
뷰에서 자식 프레임 윈도우 참조

   
 클래스에서  뷰를 둘러싸고 있는 프레임 윈도우를 참조하려면 GetParentFrame 함수를 사용한다.
   
프레임 윈도우는 비단 뷰뿐 아니라, 일반적인 윈도우를 둘러싸는 틀로써 사용될  있기 때문에
    GetParentFrame
함수는 CWnd 클래스의 멤버 함수로 되어 있다. 물론 CView에서도 사용할  있다.
   
    CFrameWnd* CWnd::GetParaentFrame() const;
   
   
단일 다큐먼트 프로그램에서는 메인 프레임 윈도우를 얻는 AfxGetMainWnd 함수와 GetParentFrame
   
함수의 반환값이 같다. 그러나 다중 다큐먼트 프로그램에서는 메인 프레임 윈도우의 포인터를
   
반환하는 AfxGetMainWnd 함수와 자식 프레임 윈도우의 포인터를 반환하는 GetParentFrame 함수가
   
서로 구별된다.
   
5.
다큐먼트에서 /프레임 윈도우 참조

   
다큐먼트에서  참조
   
   
다큐먼트에서 뷰의 포인터를 얻으려면 GetFirstViewPosition 함수와 GetNextView 함수를 조합하여
   
사용하여야 한다. 다큐먼트에서 뷰를 참조하는 것이 함수 하나로 안되고 복잡해지는 이유는
   
하나의 다큐먼트에 여러 개의 뷰가 결합될  있기 때문이다.
   
   
다큐먼트에는 이와 연결된 뷰가 리스트로 관리되고 있다. GetFirstViewPosition 함수를 호출하면
   
 번째 뷰가 매달려 있는 포인터가 얻어지고 GetNextView 반복 호출하면 다음 뷰들이 차례로
   
얻어진다. 다음은 다큐먼트와 연결된 모든  클래스를 차례로 얻어  클래스의 멤버 함수인
    UpdateWindow
함수를 호출하는 예이다.
   
    void CMyDoc::OnRepaintAllViews() {
        POSITION pos = GetFirstViewPosition();
        while ( pos != NULL ) {
            CView* pView = GetNextView(pos);
            pView->UpdateWindow();
        }
    }
   
   
다큐먼트에 뷰가 오직 하나만 연결되어 있는 경우에는 다음과 같이 간단하게  클래스의 인스턴스
   
포인터를 얻어낼  있다. m_viewList CDocument 클래스의 멤버 변수로서 뷰를 관리하는 리스트이다.
   
이것을 이용하여 GetHead 함수를 호출하면 리스트에 들어 있는  번째 뷰가 얻어진다.
   
    void CMyDoc::OnRepaintViews() {
        CView* pView = m_viewList.GetHead();
        pView->UpdateWindow();
    }
   
   
다큐먼트에서 프레임 윈도우 참조
   
   
다큐먼트에서 프레임 윈도우를 직접 참조하는 일은 없다. 단일 다큐먼트 프로그램의 경우에는 그냥
    AfxGetMainWnd
함수를 호출하면 되지만 다중 다큐먼트 프로그램의 경우에는 먼저 다큐먼트의
   
뷰를 얻고  뷰에서 자신을 포함하는 프레임 윈도우를 얻는 단계를 밟아야 한다.
   
6.
프레임 윈도우에서  참조

   
프레임 윈도우에서 뷰를 참조하려면 GetActiveView 함수를 사용한다.
   
    CView* CFrameWnd::GetActiveView() const;
   
   
하나의 프레임 윈도우에는 분할 윈도우를 이용하여   이상의 뷰가 들어갈  있다.
    GetActiveView
함수는 현재 프레임 윈도우와 연결된   활성화  것의 포인를 반환한다.
   
7.
프레임 윈도우에서 다큐먼트 참조

   
프레임 윈도우 클래스에서 다큐먼트 클래스를 참조하려면 GetActiveDocument 함수를 사용한다.
   
    virtual CDocument* CFrameWnd::GetActiveDocument();
   
   
 함수는 현재 프레임 윈도우와 연결된 다큐먼트  활성화  것의 포인터를 반환한다.
   
8.
다큐먼트 템플릿에서 다큐먼트//자식 프레임 윈도우 참조

   
다중 다큐먼트 프로그램에는 여러 개의 다큐먼트//자식 프레임 윈도우가 있을  있으며
   
다큐먼트 템플릿을 이용하면 이들 모두 하나하나 참조가 가능하다.
   
   
같은 타입의 클래스의 인스턴스가   이상 존재하는 것들은 모두 연결 리스트로
   
이루어져 있습니다. 연결 리스트에 매달려 있는 노드를 참조하는 함수는 모두 다음과 같은
   
형식으로 되어 있다.
   
    POSITION pos = GetFirstXXXPosition();
    while ( pos != NULL )
        XXX xx = (XXX *)GetNextXXX( pos );
       
   
,  번째 노드의 위치를 알려면 GetFirstXXXPosition 함수를 호출하면 되고, GetNextXXX
   
함수를 반복 호출함으로써 다음 노드를 참조할  있다.
   
   
다큐먼트 템플릿 얻기
   
   
예를 들어 CWinApp 클래스에 CMultiDocTemplate    매달려 있을 ,  번째
    CMultiDoc
 인스턴스를 얻고 싶으면 먼저 GetFirstDocTemplatePosition 함수를 호출하여
   
 번째 노드의 포인터를 얻은  GetNextDocTemplate 함수를   반복 호출하면 된다.
   
    POSITION CWinApp::GetFirstDocTemplatePosition();
    CDocTemplate* CWinApp::GetNextDocTemplate(POSITION& pos);
   
   
 함수들이 모두 CWinApp 클래스의 멤버 함수이며 GetNextDocTemplate 함수의 반환값은
    CDocTemplate
 포인터이다.
   
   
다큐먼트 얻기
   
   
같은 방법으로 CMultiDocTemplate 클래스에 CDocument   매달려 있을 ,  번째
    CDocument
 인스턴스를 얻고 싶으면 먼저 GetFirstDocPosition 함수를 호출하여  번째
   
노드의 포인터를 얻은  GetNextDoc 함수를   반복 호출하면 된다.
   
    virtual POSITION CDocTemplate::GetFirstDocPosition();
    virtual CDocument* CDocTemplate::GetNextDoc(POSITION& rPos);
   
   
 함수들은 모두 CDocTemplate 클래스의 멤버함수이며 GetNextDoc 함수의 반환 값은
    CDocument
 포인터이다.
   
   
 얻기
   
   
역시 마찬가지 방법으로 CDocument 클래스에 CView   매달려 있을   번째
    CView
 인스턴스를 얻고 싶으면 먼저 GetFirstViewPosition 함수를 호출하여  번째
   
노드의 포인터를 얻은  GetNextView 함수를   반복 호출하면 된다.
   
    virtual POSITION CDocument::GetFirstViewPosition();
    virtual CView* CDocument::GetNextView(POSITION& rPosition);
   
   
 함수들은 모두 CDocument 클래스의 멤버 함수이며 GetNextView 함수의 반환 값은
    CView
 포인터이다.
   
   
사용 
   
   
예를 들어, 현재 프로그램에 존재하는 모든 뷰의 포인터를 얻어내고 Invalidate 함수를
   
호출하여 모든 뷰의 화면이 다시 그려지도록 하기 위해서는
   
    void CMyClass::OnUpdateAllViews() {
        CWinApp *pApp = AfxGetApp();
        POSITION posTemplate = pApp->GetFirstDocTemplatePosition();
        while ( posTemplate ) {
            CDocTemplate* pTemplate = pApp->GetNextDocTemplate(posTemplate);
            POSITION posDoc = pTemplate->GetFirstDocPosition();
            while ( posDoc ) {
                CDocument* pDoc = pTemplate->GetNextDoc(posDoc);
                POSITION posView = pDoc->GetFirstViewPosition();
                while ( posView ) {
                    CView* pView = pDoc->GetNextView(posView);
                    pView->Invalidate();
                }
            }
        }
    }
   
   
 같이 하면 된다.

 

 

신고
Tag

다른 카테고리의 글 목록

Programming/MFC 카테고리의 포스트 목록