SAMPLE: VSWAP Demos Multiple-View Switching in SDIID: Q141333
|
VSWAP demonstrates methods of switching between multiple views on a single
document in a single-document interface (SDI) application. VSWAP displays
two form views and a normal view that displays the list of data collected
in the two form views.
NOTE: This is the 16-bit version of this sample. There is an equivalent
32-bit sample available under the name VSWAP32.
This sample application demonstrates using DDX/DDV (dialog data
exchange/dialog data validation), with correct document updating and
data validation when switching between views. It also correctly
catches unsaved/unvalidated data when the application is closed.
The following file is available for download from the Microsoft Software
Library:
Vswap.exeFor more information about downloading files from the Microsoft Software Library, please see the following article in the Microsoft Knowledge Base:
Q119591 How to Obtain Microsoft Support Files from Online ServicesAfter downloading the file, use the following command to extract the sample and build the appropriate directory structure:
VSWAP.EXE -d
The most important implementations of this are in:
CVswapApp::InitInstance
CVswapApp::SwitchView
CVswapApp::SaveActiveViewsData
The standard InitInstance code creates an initial frame, document, and
view during the call to OnFileNew. The code added to the end of the
InitInstance in this sample creates the view objects for the extra views
used in this application and stores their pointers in a CVswapApp member
array. It then cycles through a loop which creates the windows for the
view objects. Each view window is created with a unique child window ID
and a CCreateContext object that associates each view with the same
CDocument object, which was created by OnFileNew. Finally, the sample code
triggers the OnInitialUpdate for the extra views.
The SwitchView function is included here as a reference.
CView* CVswapApp::SwitchView( UINT nIndex )
{
ASSERT( nIndex >=0 && nIndex < NUMVIEWS );
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 valiation fails
if ( ! SaveActiveViewsData() )
{
return pActiveView;
}
m_nCurView = nIndex; // Store the new current view's index
// exchange view window IDs so RecalcLayout() works
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);
// 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();
pNewView->Invalidate();
return pActiveView;
}
For examples of other applications that switch views, please refer to the following SAMPLES:
COLLECT (SDI)
ENROLL (SDI)
VWRPLC (MDI)
SPLIT (Splitter).
For more information on DDX and DDV routines, please see Technical Note
26: DDX and DDV Routines in the Microsoft Development Library.Q99562 Switching Views in a Single Document Interface Program
Additional query words: VSWAP VSWAP32
Keywords : kbcode kbsample kbDocView kbMFC kbVC
Version : 1.0 1.5 1.51 1.52 2.0 2.1 2.52
Platform : WINDOWS
Issue type :
Last Reviewed: August 8, 1999