Adding Multiple Views to a VC++ 2010 SDI using MFC

2.7k views Asked by At

I'm trying to add multiple (actually 3 ) views to an SDI application and give the user choose witch View will be load according to his choice :

IMG

I have followed this tutorial in the official MS documentation . So, have created three classes : CAdminView CAssistantView CBiblioView and an authentication class associated to a dialog frame .

My Questions are :

1) how to edit this three view classes (Graphically) ?

2) at first time I want to show just the authentication dialog window , how to do that ?

* I tried to change m_pMainWnd->ShowWindow(SW_SHOW);

  by m_pMainWnd->ShowWindow(SW_HIDE); but no expected result

3) I expect to load the view according to parameter, this is what I added to the InitInstance funnction :

                CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();
                m_BiblioView = (CView*) new CBiblioView;
                m_AdminView = (CView*) new CAdminView;
                m_AssistantView = (CView*) new CAssistantView;
                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_AdminView->Create(NULL, "Fenetre Administrarteur", WS_CHILD, rect, m_pMainWnd, viewID, &newContext);
                m_AssistantView->Create(NULL, "Fenetre Assistant", WS_CHILD, rect, m_pMainWnd, viewID, &newContext);
                m_BiblioView->Create(NULL, "Fenetre Bibliothecaire ", 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_AdminView->SendMessage(WM_INITIALUPDATE, 0, 0);
                m_AssistantView->SendMessage(WM_INITIALUPDATE, 0, 0);
                m_BiblioView->SendMessage(WM_INITIALUPDATE, 0, 0);

and this is my switch function :

CView* CMiniProjetApp::SwitchView(int Code ) //1 : Admi / 2 : Biblio / 3 : Assistant
{
   CView* pActiveView =((CFrameWnd*) m_pMainWnd)->GetActiveView();

   CView* pNewView= NULL;
   switch(Code){

   case 1 : pNewView= m_AdminView; break;
   case 2 : pNewView= m_BiblioView; break;
   case 3 : pNewView= m_AssistantView; break;
   }

   // 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;
}

Any errors notices ??!!

*please help me !

Thanks .

1

There are 1 answers

0
xMRi On

Showing and Hiding the window is the correct way. But you Need to set the view as active too. You find the required working codein this MSDN Sample VSSWAP32.

The required code to switch and hide the other views is shown in the article.