將多個檢視加入至單一文件
在單一文件介面 (SDI) (SDI) 應用程式建立與 Microsoft Foundation Class (MFC) 程式庫,每個資料型別與單一檢視型別。 在某些情況下,可以交換的文件的目前檢視有新的檢視是適當的。
提示
如需實作多個檢視的其他程序單一文件,請參閱 CDocument::AddView 和 收集 MFC 範例。
您可以將新的 CView實作這項功能衍生類別和其他程式碼動態切換的檢視現有的 MFC 應用程式。
步驟如下:
修改現有的應用程式類別
建立和修改新的檢視類別。
建立和附加新的檢視。
實作切換函式
加入對切換檢視
本主題的其餘部分會假設下列項目:
CWinApp的名稱衍生物件為,則為 CMyWinApp,且 CMyWinApp 在 MYWINAPP.H 和 MYWINAPP.CPP 宣告和定義。
CNewView 是新的 CView名稱衍生物件和 CNewView 在 NEWVIEW.H 和 NEWVIEW.CPP 宣告和定義。
修改現有的應用程式類別
對於應用程式切換檢視之間,您需要將成員變數儲存檢視和方法修改應用程式類別交換它們。
將下列程式碼加入至 CMyWinApp 類別,放在 MYWINAPP.H 宣告之後:
CView* m_pOldView;
CView* m_pNewView;
CView* SwitchView( );
新的成員變數、 m_pOldView 和 m_pNewView,指向目前檢視和新建立一個。 新的方法 (SwitchView) 切換檢視時,要求使用者。 方法的主體會在 實作切換函式的本主題稍後會討論。
對應用程式類別的上次修改要求包括定義用來開啟或關閉函數的 Windows 訊息的新標頭檔 (WM_INITIALUPDATE)
下行程式碼插入 MYWINAPP.CPP 的相關部分:
#include <AFXPRIV.H>
儲存變更並繼續進行下一個步驟。
建立和修改新的檢視類別。
建立新的檢視類別檢視可讓您輕鬆地使用 New Class 可用的命令。 這個類別的唯一要求是衍生自 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 方法的程式碼,當應用程式需要切換檢視之間切換時。 這可以使用幾種方式:透過內部使用者加入新的功能表項目可選取或切換檢視,在特定條件。
如需加入新的功能表項目和命令處理常式函式的詳細資訊,請參閱 命令和控制項通知的處理常式。。