Como permutar Views numa Aplicação SDI.

Definir as constantes que pretendemos - em qualquer lugar - para identificar as Views


const UINT VENDAS_VIEW = 1U;
const UINT PRODUTOS_VIEW = 2U;
//...etc...


NA CMainFrame
--------------------

CMainFrame::CMainFrame()
{
        m_CurrentViewID = VENDAS_VIEW; // qual a view por defeito 
}


void CMainFrame::SeleccionaView(UINT ViewID)
{
        CView * pOldActiveView = GetActiveView(); // obtém a view actual
        CView * pNewActiveView = (CView*)GetDlgItem(ViewID);

        if( pNewActiveView == NULL )
        {
        switch(ViewID)
        {
                case PRODUTOS_VIEW:
                            pNewActiveView = (CView*) new CProdutosView;
                            break;
                    //... etc ...

                default:
                            AfxMessageBox("ID da View errado!");

                            return;
            }

            CCreateContext context;
            context.m_pCurrentDoc = pOldActiveView->GetDocument();
            pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,ViewID,&context);
            pNewActiveView->OnInitialUpdate();
        }

        SetActiveView(pNewActiveView);
        pOldActiveView->ShowWindow(SW_HIDE);
        pNewActiveView->ShowWindow(SW_SHOW);
        pOldActiveView->SetDlgCtrlID(m_CurrentViewID);
        pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
        m_CurrentViewID=ViewID;
        RecalcLayout();
}


Deve-se definir uma função que permita aceder ao SeleccionaView da CMainFrame,
esta função pode estar associada a uma opção de menu, ou ao que quisermos.


Por exemplo:


void CXXXView::OnButtonX() 
{
        ((CMainFrame*)GetParentFrame())->SeleccionaView(PRODUTOS_VIEW);
}

Neste caso muda a View para ficar com a FormView de CProdutosView.