ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Multi View - SDI
    MFC 2008. 12. 8. 16:57
    class CMainFrame : public CFrameWnd
    {
    ...
    // Generated message map functions
    protected:
        //{{AFX_MSG(CMainFrame)
        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
        afx_msg void OnViewChange();
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
    // {
    private:
        void SecondView();
        void FirstView();
        int m_nViewFlag;

        enum {FIRSTVIEW=1, SECONDVIEW};

        CPractice10_3View *m_pFirstView;        // 두개의 뷰 클래스 에 대한
        CSecondView *m_pSecondView;                // 객체를 등록한다.
    // }
    };


    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
        //{{AFX_MSG_MAP(CMainFrame)
        ON_WM_CREATE()
        ON_COMMAND(ID_VIEW_CHANGE, OnViewChange)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    ...
    CMainFrame::CMainFrame()
    {
        // TODO: add member initialization code here
         m_nViewFlag = FIRSTVIEW;        // 처음에 FIRSTVIEW (폼 뷰)로 설정.

        m_pFirstView = NULL;
        m_pSecondView = NULL;
    }
    ...
    void CMainFrame::OnViewChange()
    {
        // TODO: Add your command handler code here
         if(m_nViewFlag == SECONDVIEW)         // 뷰가 일반 뷰 인 상태에서 [보기/뷰 전환]
         {                    // 메뉴를 선택하면 FirstView( ) 호출
              FirstView();  
              m_nViewFlag = FIRSTVIEW ;                 
         }
         else if(m_nViewFlag == FIRSTVIEW)      // 뷰가 폼 뷰 인 상태에서 [보기/뷰 전환]
         {                    // 메뉴를 선택하면 SecondView( ) 호출
              SecondView();                    
              m_nViewFlag = SECONDVIEW;                    
        }
    }

    void CMainFrame::FirstView()
    {
        CDocument* pDoc = GetActiveDocument();

        ASSERT (m_pFirstView != 0);
        ASSERT (m_pSecondView != 0);

        pDoc->AddView(m_pFirstView);

         m_pFirstView->ShowWindow(SW_SHOW);        // 폼뷰를 화면에 보이게 한다
         m_pSecondView->ShowWindow(SW_HIDE);        // 에디트 뷰를 숨긴다

         m_pFirstView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);  // 메세지가 발생할 경우
         m_pSecondView->SetDlgCtrlID(AFX_IDW_PANE_FIRST+1);  // 메세지가 발생할 경우

         SetActiveView(m_pFirstView);                     // 폼뷰를 활성화 시킨다
         pDoc->RemoveView(m_pSecondView);
         RecalcLayout();                                     // 폼 뷰에서 처리하도록 설정
    }

    void CMainFrame::SecondView()
    {
        CDocument* pDoc = GetActiveDocument();

        if(m_pSecondView == NULL)    // 객체가 아직 생성된적이 없다면 if블럭실행
        {
            m_pFirstView = (CPractice10_3View *)GetActiveView();// 현재 활성화 되어있는
                                                               // 뷰를 얻는다
            m_pSecondView = new CSecondView;  // 객체 생성
    //        CCreateContext context;  // 도큐먼트에 대한 정보를 가지고 있는 객체 생성
    //        context.m_pCurrentDoc = pDoc;
    //        context.m_pCurrentDoc = m_pFirstView->GetDocument(); //도큐먼트를 얻는다
            m_pSecondView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, rectDefault, this, AFX_IDW_PANE_FIRST+1);
    //            &context);                   // 뷰를 생성
            m_pSecondView->OnInitialUpdate();      // 뷰 업데이트
        }

        pDoc->AddView(m_pSecondView);

        m_pFirstView->SetDlgCtrlID(AFX_IDW_PANE_FIRST+1);
        m_pSecondView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);

        m_pFirstView->ShowWindow(SW_HIDE);     // 첫 번째 뷰를 숨긴다
        m_pSecondView->ShowWindow(SW_SHOW); // 활성화 시킨 두 번째 뷰를 화면에 나타낸다

        SetActiveView(m_pSecondView);           // 두번째 뷰를 활성화 시킨다.
        pDoc->RemoveView(m_pFirstView);
        RecalcLayout();

    //    m_nViewFlag = SECONDVIEW;           // 뷰가 에디트 뷰로 바뀐 상태 이므로
                                                // SECONDVIEW로 재 설정
    }


    참조 사이트:

Designed by Tistory.