다음을 통해 공유


단일 문서에 뷰 여러 개 추가

MFC(Microsoft Foundation Class) 라이브러리를 사용하여 만든 SDI(단일 문서 인터페이스) 애플리케이션에서 각 문서 형식은 단일 보기 형식과 연결됩니다. 경우에 따라 문서의 현재 보기를 새 보기로 전환하는 기능을 사용하는 것이 좋습니다.

단일 문서에 대해 여러 보기를 구현하는 방법에 대한 추가 절차는 CDocument::AddViewCOLLECT MFC 샘플을 참조하세요.

보기를 기존 MFC 애플리케이션으로 동적으로 전환하기 위한 새 CView파생 클래스 및 추가 코드를 추가하여 이 기능을 구현할 수 있습니다.

절차는 다음과 같습니다.

이 항목의 re기본der는 다음을 가정합니다.

  • 파생 개체 CMyWinAppCMyWinAppCWinApp이름은 MYWINAPP에서 선언되고 정의됩니다. HMYWINAPP. CPP.

  • CNewView 는 새 CView파생 개체의 이름이며 CNewView NEWVIEW에서 선언되고 정의됩니다. HNEWVIEW. CPP.

기존 애플리케이션 클래스 수정

애플리케이션이 보기 간에 전환하려면 뷰를 저장할 멤버 변수와 뷰를 전환하는 메서드를 추가하여 애플리케이션 클래스를 수정해야 합니다.

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

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

새 멤버 변수 및 m_pOldViewm_pNewView현재 뷰와 새로 만든 뷰를 가리킵니다. 새 메서드(SwitchView)는 사용자가 요청할 때 보기를 전환합니다. 메서드 본문은 이 항목의 뒷부분에 있는 전환 함수 구현에 대해 설명합니다.

애플리케이션 클래스를 마지막으로 수정하려면 전환 함수에 사용되는 Windows 메시지(WM_INITIALUPDATE)를 정의하는 새 헤더 파일을 포함해야 합니다.

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

#include <AFXPRIV.H>

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

새 뷰 클래스 만들기 및 수정

클래스 뷰에서 사용할 수 있는 새 클래스 명령을 사용하여 새 뷰 클래스쉽게 만들 수 있습니다. 이 클래스의 유일한 요구 사항은 .에서 CView파생된다는 것입니다. 이 새 클래스를 애플리케이션에 추가합니다. 프로젝트에 새 클래스를 추가하는 방법에 대한 자세한 내용은 클래스 추가를 참조 하세요.

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

NEWVIEW를 수정 합니다. 생성자 및 소멸자에 대한 액세스 지정자를 H로 protectedpublic 변경합니다. 이렇게 하면 클래스를 동적으로 만들고 제거할 수 있으며 보기 모양이 표시되기 전에 수정할 수 있습니다.

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

새 보기 만들기 및 연결

새 보기를 만들고 연결하려면 애플리케이션 클래스의 함수를 InitInstance 수정해야 합니다. 수정은 새 뷰 개체를 만든 다음 두 개의 기존 뷰 개체를 사용하여 m_pOldViewm_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 하는 코드를 추가하는 작업이 포함됩니다. 이 작업은 사용자가 선택할 수 있는 새 메뉴 항목을 추가하거나 특정 조건이 충족될 때 내부적으로 보기를 전환하여 여러 가지 방법으로 수행할 수 있습니다.

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

참고 항목

문서/뷰 아키텍처