www.gusucode.com > 可变的分割视图,VC++从多种方式分割窗体视图-源码程序 > 可变的分割视图,VC++从多种方式分割窗体视图-源码程序/code/BaseVarFrame.cpp

    // CBaseVarFrame.cpp : implementation of the CBaseVarFrame class
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "resource.h"
#include "BaseVarFrame.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBaseVarFrame
IMPLEMENT_DYNCREATE(CBaseVarFrame, CMDIChildWnd)

BEGIN_MESSAGE_MAP(CBaseVarFrame, CMDIChildWnd)
	//{{AFX_MSG_MAP(CBaseVarFrame)
	ON_COMMAND(ID_SPLITTER_UNO, OnSplitterUno)
	ON_UPDATE_COMMAND_UI(ID_SPLITTER_UNO, OnUpdateSplitterUno)
	ON_COMMAND(ID_SPLITTER_DUE, OnSplitterDue)
	ON_UPDATE_COMMAND_UI(ID_SPLITTER_DUE, OnUpdateSplitterDue)
	ON_COMMAND(ID_SPLITTER_TRE, OnSplitterTre)
	ON_UPDATE_COMMAND_UI(ID_SPLITTER_TRE, OnUpdateSplitterTre)
	ON_COMMAND(ID_SPLITTER_NESSUNO, OnSplitterNessuno)
	ON_UPDATE_COMMAND_UI(ID_SPLITTER_NESSUNO, OnUpdateSplitterNessuno)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBaseVarFrame construction/destruction

CBaseVarFrame::CBaseVarFrame()
{
	// TODO: add member initialization code here
m_nStato = 0;
m_pwndSplitter = new CSplitterWnd;	
m_pwndSplitter1 = new CSplitterWnd;
 m_pClass = NULL;
m_pDefaultView = NULL;

}

CBaseVarFrame::~CBaseVarFrame()
{
	if (m_pwndSplitter)
		delete m_pwndSplitter;
	if (m_pwndSplitter1)
		delete m_pwndSplitter1;
}

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

 m_pDefaultView = pContext->m_pNewViewClass;
if (m_pClass == NULL)
OnConfigViews();
 if (!m_nStato)
	 return  CMDIChildWnd::OnCreateClient(lpcs,pContext);
	 CSize s3(0,lpcs->cy/m_nStato);
 	if (!m_pwndSplitter->CreateStatic (this, 1, 2))
				 return FALSE;
    if  (!m_pwndSplitter->CreateView (0,0,pContext->m_pNewViewClass,CSize (192, 0) , pContext))
    return FALSE;
	if (m_nStato > 1)
	{			 if (!m_pwndSplitter1->CreateStatic (m_pwndSplitter, m_nStato,1,WS_CHILD|WS_VISIBLE,m_pwndSplitter->IdFromRowCol(0,1)))
				return FALSE;
	for(int i=0;i<m_nStato;i++)
	m_pwndSplitter1->CreateView (i,0,m_pClass[i],s3,pContext);
}
 else if (!m_pwndSplitter->CreateView(0,1,m_pClass[0],CSize(0,0), pContext))
 return FALSE;
 return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CBaseVarFrame diagnostics

#ifdef _DEBUG
void CBaseVarFrame::AssertValid() const
{
	CMDIChildWnd::AssertValid();
}

void CBaseVarFrame::Dump(CDumpContext& dc) const
{
	CMDIChildWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBaseVarFrame message handlers

void CBaseVarFrame::OnSplitterUno() 
{
	// TODO: Add your command handler code here
if (m_nStato == 1)
return;
	m_nStato = 1;	
RebuildSpitter();
}

void CBaseVarFrame::OnUpdateSplitterUno(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
		pCmdUI->SetRadio(m_nStato == 1);
  pCmdUI->Enable(m_nClass > 0);
}

void CBaseVarFrame::OnSplitterDue() 
{
	// TODO: Add your command handler code here
if (m_nStato == 2)
return;
	m_nStato = 2;	
RebuildSpitter();

}

void CBaseVarFrame::OnUpdateSplitterDue(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
		pCmdUI->SetRadio(m_nStato == 2);
  pCmdUI->Enable(m_nClass > 1);

	
}

void CBaseVarFrame::OnSplitterTre() 
{
	// TODO: Add your command handler code here
if (m_nStato == 3)
return;
m_nStato = 3;
RebuildSpitter();	
	
}

void CBaseVarFrame::OnUpdateSplitterTre(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_nStato == 3);
	  pCmdUI->Enable(m_nClass > 2);

}

void CBaseVarFrame::OnSplitterNessuno() 
{
	// TODO: Add your command handler code here
if (m_nStato == 0)
return;
m_nStato = 0;
     CView * pActiveView= GetActiveView();

    CDocument * pDoc= pActiveView->GetDocument();
		pDoc->m_bAutoDelete=FALSE;    
m_pwndSplitter1->DestroyWindow();
m_pwndSplitter->DestroyWindow();
 		delete m_pwndSplitter;
 		delete m_pwndSplitter1;
m_pwndSplitter = new CSplitterWnd;	
m_pwndSplitter1 = new CSplitterWnd;	

		pDoc->m_bAutoDelete=TRUE;    

   CCreateContext context;
   context.m_pNewViewClass= m_pDefaultView;
   context.m_pCurrentDoc=pDoc;
   context.m_pNewDocTemplate=NULL;
   context.m_pLastView=NULL;
   context.m_pCurrentFrame=NULL;


	CView* p = (CView*)CreateView(&context, AFX_IDW_PANE_FIRST);

	 SetActiveView(p);
   p->OnInitialUpdate();
	RecalcLayout();
 
}

void CBaseVarFrame::OnUpdateSplitterNessuno(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_nStato == 0);
	
}

BOOL CBaseVarFrame::RebuildSpitter()
{
	CCreateContext context;
    CDocument * pDoc;
 if (m_pwndSplitter->m_hWnd == NULL)
 {
	 CRect r;
	 GetClientRect(r);
CREATESTRUCT s;
s.cy = r.bottom-r.top;
	 CView * pActiveView= GetActiveView();
     pDoc= pActiveView->GetDocument();
	pDoc->m_bAutoDelete=FALSE; 
	   pActiveView->DestroyWindow();
    pDoc->m_bAutoDelete=TRUE;

   context.m_pNewViewClass= m_pDefaultView;
   context.m_pCurrentDoc=pDoc;
   context.m_pNewDocTemplate=NULL;
   context.m_pLastView=NULL;
   context.m_pCurrentFrame=NULL;
  if (!OnCreateClient(&s,&context))
	  return FALSE;
   CView* pV = (CView *)m_pwndSplitter->GetPane(0,0);
   if (pV == NULL)
	   AfxMessageBox("null view");
  SetActiveView(pV);
     pV->OnInitialUpdate();
	 if (m_nStato == 1)
    {
	pV = (CView *)m_pwndSplitter->GetPane(0,1);
     pV->OnInitialUpdate();
	}
	else
		for(int i=0;i< m_nStato;i++)
    {
	pV = (CView *)m_pwndSplitter1->GetPane(i,0);
     pV->OnInitialUpdate();
	}
RecalcLayout();
  return TRUE;
}

 
   // Get pointer to CDocument object so that it can be used in the creation 
   // process of the new view

   CView * pActiveView= GetActiveView();
   if (pActiveView == NULL)
	   AfxMessageBox("noview");
CRect r;
  pActiveView->GetClientRect(r);
  CSize s3(0,0);
   if (m_nStato)
   s3.cy = (r.bottom-r.top)/m_nStato;

 pDoc= pActiveView->GetDocument();
   context.m_pNewViewClass= m_pClass[0];
   context.m_pCurrentDoc=pDoc;
   context.m_pNewDocTemplate=NULL;
   context.m_pLastView=NULL;
   context.m_pCurrentFrame=NULL;

    // set flag so that document will not be deleted when view is destroyed
	pDoc->m_bAutoDelete=FALSE;    
    // Delete existing view 
	int i;

   if (m_pwndSplitter1->m_hWnd)
	   m_pwndSplitter1->DestroyWindow();
  else
	{
   CView* pV = (CView *)m_pwndSplitter->GetPane(0,1);
   pV->DestroyWindow();
	 }

    pDoc->m_bAutoDelete=TRUE;
     if (m_nStato > 1)
	{
       delete m_pwndSplitter1;
	   m_pwndSplitter1 = new CSplitterWnd;	
		if (!m_pwndSplitter1->CreateStatic (m_pwndSplitter, m_nStato,1,WS_CHILD|WS_VISIBLE,m_pwndSplitter->IdFromRowCol(0,1)))
		return FALSE;
	 }
   
   context.m_pNewViewClass= m_pClass[0];
   context.m_pCurrentDoc=pDoc;
   context.m_pNewDocTemplate=NULL;
   context.m_pLastView=NULL;
   context.m_pCurrentFrame=NULL;
if (m_nStato > 1)
   for(i=0;i<m_nStato;i++)
  {
	   m_pwndSplitter1->CreateView(i,0,m_pClass[i],s3, &context);
 
   CView * pNewView= (CView *)m_pwndSplitter1->GetPane(i,0);
   
   	
   pNewView->OnInitialUpdate();
}
else
  {
	
		m_pwndSplitter->CreateView(0,1,m_pClass[0],s3, &context);
 
 		CView * pNewView= (CView *)m_pwndSplitter->GetPane(0,1);
 		pNewView->OnInitialUpdate();
   }
	 SetActiveView((CView*)m_pwndSplitter->GetPane(0,0));

	   m_pwndSplitter->RecalcLayout(); 
 if (m_nStato > 1)
	 m_pwndSplitter1->RecalcLayout(); 
 return TRUE;
}
	void CBaseVarFrame::ConfigViews(CRuntimeClass** pviews,int nviews,int InitialStato)
  {
		m_pClass = pviews;
		m_nClass = nviews;
        m_nStato = InitialStato;
		if (m_nStato >= m_nClass)
			m_nClass = 0;
	}
void CBaseVarFrame::OnConfigViews() 
{
}