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로 재 설정
}
참조 사이트: