단일 문서에 뷰 여러 개 추가
MFC(Microsoft Foundation Class) 라이브러리를 사용하여 만든 SDI(단일 문서 인터페이스) 애플리케이션에서 각 문서 형식은 단일 보기 형식과 연결됩니다. 경우에 따라 문서의 현재 보기를 새 보기로 전환하는 기능을 사용하는 것이 좋습니다.
보기를 기존 MFC 애플리케이션으로 동적으로 전환하기 위한 새 CView
파생 클래스 및 추가 코드를 추가하여 이 기능을 구현할 수 있습니다.
절차는 다음과 같습니다.
이 항목의 re기본der는 다음을 가정합니다.
파생 개체
CMyWinApp
CMyWinApp
의CWinApp
이름은 MYWINAPP에서 선언되고 정의됩니다. H 및 MYWINAPP. CPP.CNewView
는 새CView
파생 개체의 이름이며CNewView
NEWVIEW에서 선언되고 정의됩니다. H 및 NEWVIEW. CPP.
기존 애플리케이션 클래스 수정
애플리케이션이 보기 간에 전환하려면 뷰를 저장할 멤버 변수와 뷰를 전환하는 메서드를 추가하여 애플리케이션 클래스를 수정해야 합니다.
MYWINAPP의 선언 CMyWinApp
에 다음 코드를 추가합니다. H:
CView *m_pOldView;
CView *m_pNewView;
CView *SwitchView();
새 멤버 변수 및 m_pOldView
m_pNewView
현재 뷰와 새로 만든 뷰를 가리킵니다. 새 메서드(SwitchView
)는 사용자가 요청할 때 보기를 전환합니다. 메서드 본문은 이 항목의 뒷부분에 있는 전환 함수 구현에 대해 설명합니다.
애플리케이션 클래스를 마지막으로 수정하려면 전환 함수에 사용되는 Windows 메시지(WM_INITIALUPDATE)를 정의하는 새 헤더 파일을 포함해야 합니다.
MYWINAPP의 포함 섹션 에 다음 줄을 삽입합니다. CPP:
#include <AFXPRIV.H>
변경 내용을 저장하고 다음 단계로 계속 진행합니다.
새 뷰 클래스 만들기 및 수정
클래스 뷰에서 사용할 수 있는 새 클래스 명령을 사용하여 새 뷰 클래스를 쉽게 만들 수 있습니다. 이 클래스의 유일한 요구 사항은 .에서 CView
파생된다는 것입니다. 이 새 클래스를 애플리케이션에 추가합니다. 프로젝트에 새 클래스를 추가하는 방법에 대한 자세한 내용은 클래스 추가를 참조 하세요.
프로젝트에 클래스를 추가한 후에는 일부 뷰 클래스 멤버의 접근성을 변경해야 합니다.
NEWVIEW를 수정 합니다. 생성자 및 소멸자에 대한 액세스 지정자를 H로 protected
public
변경합니다. 이렇게 하면 클래스를 동적으로 만들고 제거할 수 있으며 보기 모양이 표시되기 전에 수정할 수 있습니다.
변경 내용을 저장하고 다음 단계로 계속 진행합니다.
새 보기 만들기 및 연결
새 보기를 만들고 연결하려면 애플리케이션 클래스의 함수를 InitInstance
수정해야 합니다. 수정은 새 뷰 개체를 만든 다음 두 개의 기존 뷰 개체를 사용하여 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
하는 코드를 추가하는 작업이 포함됩니다. 이 작업은 사용자가 선택할 수 있는 새 메뉴 항목을 추가하거나 특정 조건이 충족될 때 내부적으로 보기를 전환하여 여러 가지 방법으로 수행할 수 있습니다.
새 메뉴 항목 및 명령 처리기 함수를 추가하는 방법에 대한 자세한 내용은 명령 및 컨트롤 알림에 대한 처리기를 참조 하세요.