다음을 통해 공유


단일 문서로 다중 뷰 추가

Microsoft Foundation 클래스 (MFC) 라이브러리를 작성 한 단일 문서 인터페이스 (SDI) 응용 프로그램에서 각 문서 형식은 단일 뷰 형식과 관련이 있습니다.일부 경우에는 문서의 현재 보기 새 보기를 전환할 수 있는 하는 것이 좋습니다.

팁

단일 문서에 대해 여러 뷰를 구현에 대 한 자세한 절차를 참조 하십시오. CDocument::AddView수집 MFC 샘플입니다.

새로 추가 하 여이 기능을 구현할 수 있습니다 CView-파생 클래스와 기존 MFC 응용 프로그램에 동적으로 보기를 전환 하는 추가 코드가 있습니다.

이 기능을 구현하는 단계는 다음과 같습니다.

  • 기존 응용 프로그램 클래스 수정

  • 만들고 새 뷰 클래스를 수정 합니다.

  • 새 보기를 첨부 합니다.

  • 전환 함수 구현

  • 뷰 전환 지원 추가

이 항목의 나머지에서는 다음을 가정합니다.

  • 이름에 CWinApp-파생된 개체입니다 CMyWinApp, 및 CMyWinApp 선언 되 고 정의에서 MYWINAPP.H와 MYWINAPP입니다.CPP입니다.

  • CNewView새 이름입니다 CView-개체에서 파생 된 및 CNewView 선언 되 고 새 보기를 정의 합니다.H와 새 보기입니다.CPP입니다.

기존 응용 프로그램 클래스 수정

보기 간에 전환 하려면 응용 프로그램에 대 한 뷰와 전환 하는 방법을 저장 하려면 멤버 변수를 추가 하 여 응용 프로그램 클래스 수정 해야 합니다.

선언에 다음 코드를 추가 합니다. CMyWinApp 에서 MYWINAPP.H:

CView* m_pOldView;
CView* m_pNewView;
CView* SwitchView( );

새 멤버 변수, m_pOldView 및 m_pNewView, 현재 보기와 새로 만든된 것을 가리킵니다.새 메서드 (SwitchView) 사용자가 요청 하면 보기를 전환 합니다.메서드 본문에이 항목의 뒷부분에 설명 되어 전환 함수 구현.

Windows 메시지를 정의 하는 새 헤더 파일을 포함 하 여 응용 프로그램 클래스를 마지막으로 수정한 필요 (WM_INITIALUPDATE) 전환 기능에 사용 됩니다.

MYWINAPP의 include 섹션에 다음 줄을 삽입 합니다.CPP:

#include <AFXPRIV.H>

변경 내용을 저장 하 고 단계로 계속 진행 합니다.

만들고 새 뷰 클래스를 수정 합니다.

새 뷰 클래스 만들기 용이 하 여는 새 클래스 클래스 뷰에서 사용할 수 있는 명령입니다.이 클래스에 대 한 유일한 요구 사항은에서 파생 되는 CView.이 새 클래스는 응용 프로그램에 추가 합니다.프로젝트에 새 클래스를 추가 하는 방법에 대 한 특정 내용은 클래스 추가.

클래스를 프로젝트에 추가한 후 일부 뷰 클래스 멤버의 액세스 가능성을 변경 해야 합니다.

새 보기를 수정 합니다.액세스 지정자에서 변경 하 여 H protected 에 public 생성자와 소멸자에 대 한.이 클래스를 만들어 동적으로 소멸 하 고 표시 되기 전에 뷰의 모양을 수정할 수 있습니다.

변경 내용을 저장 하 고 단계로 계속 진행 합니다.

새 보기를 첨부 합니다.

만들고 새 뷰에 첨부 하려면 수정할 필요는 InitInstance 함수를 응용 프로그램 클래스의.새 view 개체를 선택한 다음 초기화 두 만듭니다 새 코드 수정을 추가 m_pOldView 및 m_pNewView 두 기존 보기 개체와.

새 보기 내에서 만들어지기 때문에 InitInstance 함수를 응용 프로그램의 수명 동안 유지 신규 및 기존 보기.그러나 응용 프로그램 처럼 쉽게 새 뷰에 동적으로 만들 수 있습니다.

이 코드를 호출 하면 삽입 ProcessShellCommand:

CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();
m_pOldView = pActiveView;
m_pNewView = (CView*) new CNewView;
if (NULL == m_pNewView)
   return FALSE;

CDocument* pCurrentDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();

// Initialize a CCreateContext to point to the active document.
// With this context, the new view is added to the document
// when the view is created in CView::OnCreate().
CCreateContext newContext;
newContext.m_pNewViewClass = NULL;
newContext.m_pNewDocTemplate = NULL;
newContext.m_pLastView = NULL;
newContext.m_pCurrentFrame = NULL;
newContext.m_pCurrentDoc = pCurrentDoc;

// The ID of the initial active view is AFX_IDW_PANE_FIRST.
// Incrementing this value by one for additional views works
// in the standard document/view case but the technique cannot
// be extended for the CSplitterWnd case.
UINT viewID = AFX_IDW_PANE_FIRST + 1;
CRect rect(0, 0, 0, 0); // Gets resized later.

// Create the new view. In this example, the view persists for
// the life of the application. The application automatically
// deletes the view when the application is closed.
m_pNewView->Create(NULL, _T("AnyWindowName"), WS_CHILD, rect, m_pMainWnd, viewID, &newContext);

// When a document template creates a view, the WM_INITIALUPDATE
// message is sent automatically. However, this code must
// explicitly send the message, as follows.
m_pNewView->SendMessage(WM_INITIALUPDATE, 0, 0);

변경 내용을 저장 하 고 단계로 계속 진행 합니다.

전환 함수 구현

이전 단계에서 생성 및 새 뷰 개체를 초기화 하는 코드를 추가 합니다.마지막으로 중요 한 부분이 스위칭 메서드를 구현 하는 SwitchView.

(MYWINAPP. 응용 프로그램 클래스의 구현 파일의 끝CPP)에 다음 메서드 정의 추가 합니다.

CView* CMyWinApp::SwitchView( )
{
   CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();

   CView* pNewView = NULL;
   if(pActiveView == m_pOldView)
      pNewView = m_pNewView;
   else
      pNewView = m_pOldView;

   // Exchange view window IDs so RecalcLayout() works.
   #ifndef _WIN32
   UINT temp = ::GetWindowWord(pActiveView->m_hWnd, GWW_ID);
   ::SetWindowWord(pActiveView->m_hWnd, GWW_ID, ::GetWindowWord(pNewView->m_hWnd, GWW_ID));
   ::SetWindowWord(pNewView->m_hWnd, GWW_ID, temp);
   #else
   UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);
   ::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID));
   ::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);
   #endif

   pActiveView->ShowWindow(SW_HIDE);
   pNewView->ShowWindow(SW_SHOW);
   ((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView);
   ((CFrameWnd*) m_pMainWnd)->RecalcLayout();
   pNewView->Invalidate();
   return pActiveView;
} 

변경 내용을 저장 하 고 단계로 계속 진행 합니다.

뷰 전환 지원 추가

마지막 단계를 호출 하는 코드를 추가 하는 SwitchView 메서드는 응용 프로그램 뷰 사이 전환 하는 경우.이 여러 가지 방법으로 수행할 수 있습니다: 사용자가 선택할 수 있는 새 메뉴 항목을 추가 하거나 특정 조건이 충족 될 때 내부적으로 보기를 전환 합니다.

새 메뉴 항목 및 명령 처리기 함수를 추가 대 한 자세한 내용은 명령 및 컨트롤 알림에 대 한 처리기가.

참고 항목

개념

문서/뷰 아키텍처