Link to home
Start Free TrialLog in
Avatar of engllf
engllf

asked on

CSingleDocTemplate

An SDI application has a default CMyAppView generated by MFC. It is modified to have a splitter window. The left pane uses CLeftView and the right pane uses CRightView.

Which view should i use in the document template constructor in the InitInstance() and why?

BOOL CMyApp::InitInstance()
{
  //...
  // Establish the document type
  // supported by the application

  AddDocTemplate( new CSingleDocTemplate( IDR_MAINFRAME,
        RUNTIME_CLASS( CMyAppDoc ),
        RUNTIME_CLASS( CMyFrameWnd ),
        RUNTIME_CLASS( ????? ) ) );
       // ...
}

TIA
Avatar of mulenga
mulenga

You can use either CLeftView or CRightView, it doesn't matter since you
will need to override CMyFrameWnd::OnCreateClient().

In OnCreateClient() you will need to create a static splitter window
with two columns.  After creating the splitter window, you can then
create the two views.


Assuming that you used CRightView in your call to AddDocTemplate, then
you OnCreateClient will be similar to:

BOOL CMyFrameWnd::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
    CRect rect;
    GetClientRect(&rect);
    int width = rect.Width()/2;
    int height = rect.Height();
    CSize size(width, height);

    // create static splitter with 1 row and 2 columns
    if ( !m_wndSplitter.CreateStatic(this, 1, 2, WS_CHILD|WS_VISIBLE ) )
        return FALSE;

    // create the Left View
    if ( !m_wndSplitter.CreateView( 0, 0, RUNTIME_CLASS(CLeftView), size, pContext) )
        return FALSE;

    // Now create the right view
    if ( !m_wndSplitter.CreateView( 0, 1, pContext->m_pNewViewClass, size, pContext ) )
        return FALSE;

    return TRUE;
}
Avatar of engllf

ASKER

Hi,

what is the consequences of i do this?

BOOL CMyApp::InitInstance()
{
 //...
    AddDocTemplate( new CSingleDocTemplate( IDR_MAINFRAME,
      RUNTIME_CLASS( CMyAppDoc ),
      RUNTIME_CLASS( CMyFrameWnd ),
      RUNTIME_CLASS( CMyAppView) ) ); // neither CLeftView nor CRightView

  // ...
}

and

BOOL CMyFrameWnd::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
  ...  

   // create the Left View
   if (!m_wndSplitter.CreateView(0,0, RUNTIME_CLASS(CLeftView), size, pContext))
      return FALSE;

   // Now create the right view
   if (!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CRightView), size,pContext))
      return FALSE;

   ...
}

TIA
 
ASKER CERTIFIED SOLUTION
Avatar of smithc
smithc

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of engllf

ASKER

Good question. I will delete straight away... : )