第一,在每个视图列的构造函属性数改为public,同时头文件加上#include <shlwapi.h>;
第二:
在文档的CQiehuanApp里面弄;
1。
.h 文件
private:
UINT m_nCurView; CView *m_pViews[3];//三个视图,其中一个是本工程的视图类,2个是新建的cformview类;
afx_msg void On32772();//要点击切换视图的操作;
afx_msg void On32773();要点击切换视图的操作;
CView* SwitchView( UINT nIndex ); void CreateMoreViews(); BOOL SaveActiveViewsData();
2. .cpp 文件
步骤是 创建,保存,切换;
在初始化函数的最后,也就是return TRUE 的前面创建文档;
第一步;
BOOL CQiehuanApp::InitInstance()
{CreateMoreViews();
return TRUE;
}
void CQiehuanApp::CreateMoreViews()
{ m_nCurView = 0; // Save index of the currently active view class// Keep array of views as member of WinApp
CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();
m_pViews[0] = pActiveView;
m_pViews[1] = (CView*)(new Cmap );//定义一个screenDefineView对象; m_pViews[2] = ( CView * )new PRODATGA ;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. CRect rect(0, 0, 0, 0); // gets resized later// Need to cast pointers to have correct Create functions called
// CForm2 is CFormView::Create for ( int nView=1; nView <3; nView++ ) { // 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_pViews[nView]->Create(NULL, NULL, (AFX_WS_DEFAULT_VIEW & ~WS_VISIBLE), // views are created with the style of AFX_WS_DEFAULT_VIEW // In MFC 4.0, this is (WS_BORDER | WS_VISIBLE | WS_CHILD) rect, m_pMainWnd, AFX_IDW_PANE_FIRST + nView, &newContext); m_pViews[nView]->SendMessage( WM_INITIALUPDATE ); }// When a document template creates a view, the WM_INITIALUPDATE
// message is sent automatically. However, this code must // explicitly send the message, as follows. /*** End modification of default InitInstance ***/}第二部:
切换,切换函数里面调用保存函数;
afx_msg void On32772();//要点击切换视图的操作;
{
SwitchView( 2 );//要切换到第二张视图,第0张视图一般是工程的文档类;
}
afx_msg void On32773();要点击切换视图的操作;
{
SwitchView( 1 );//要切换到第一张视图,
}
**************
切换功能
CView* CQiehuanApp::SwitchView( UINT nIndex )
{ ASSERT( nIndex >=0 && nIndex < 3 );CView* pNewView = m_pViews[nIndex];
CView* pActiveView =
((CFrameWnd*) m_pMainWnd)->GetActiveView();if ( !pActiveView ) // No currently active view
return NULL;if ( pNewView == pActiveView ) // Already there
return pActiveView;// Update Doc's data if needed
// Don't change view if data validation fails if ( ! SaveActiveViewsData() )//这里调用了保存的函数; { return pActiveView; }m_nCurView = nIndex; // Store the new current view's index
// exchange view window ID's so RecalcLayout() works
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);// Display and update the new current view - hide the old one
pActiveView->ShowWindow(SW_HIDE); pNewView->ShowWindow(SW_SHOW); ((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView); ((CFrameWnd*) m_pMainWnd)->RecalcLayout();//将Toolbar、DialogBar等可浮动的东西安排位置、处理和View、Frame之间的位置关系的 pNewView->Invalidate(); return pActiveView;}保存功能
BOOL CQiehuanApp::SaveActiveViewsData()
{ CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();if ( !pActiveView )
return TRUE; // No active view TO save data from, so count as successreturn TRUE; // Not a view with data to save!
}