下面是我的代码,使用的是静态分割,第一次创建的时候是正常的,可是Destroy掉以后要再次创建就不行了,是不是需要用动态分割啊??还是代码哪里写的不对??该如何做??还有就是静态分割和动态分割的区别在哪呢(偶概念上不大清楚)??? m_pFrameMB = new CChildFrame();
CCreateContext m_Context;
if(!m_pFrameMB->LoadFrame(IDI_MB,WS_MAXIMIZE | WS_OVERLAPPEDWINDOW, NULL, &m_Context))
return;
if(wndSplitter.CreateStatic(this->m_pFrameMB,1,2)==NULL)
return;
wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,100), &m_Context);
wndSplitter.CreateView(0,1,RUNTIME_CLASS(CView2),CSize(100,100), &m_Context);
m_pFrameMB->ShowWindow(SW_SHOWMAXIMIZED);
m_pFrameMB->InitialUpdateFrame(NULL, true);
CCreateContext m_Context;
if(!m_pFrameMB->LoadFrame(IDI_MB,WS_MAXIMIZE | WS_OVERLAPPEDWINDOW, NULL, &m_Context))
return;
if(wndSplitter.CreateStatic(this->m_pFrameMB,1,2)==NULL)
return;
wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,100), &m_Context);
wndSplitter.CreateView(0,1,RUNTIME_CLASS(CView2),CSize(100,100), &m_Context);
m_pFrameMB->ShowWindow(SW_SHOWMAXIMIZED);
m_pFrameMB->InitialUpdateFrame(NULL, true);
enum eView { STRING = 1, HEX = 2 };
void SwitchToView(eView nView);
void CMainFrame::SwitchToView(eView nView)
{
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView = (CView*) GetDlgItem(nView);
if (pNewActiveView == NULL) {
switch (nView) {
case STRING:
pNewActiveView = (CView*) new CStringView;
break;
case HEX:
pNewActiveView = (CView*) new CHexView;
break;
}
CCreateContext context;
context.m_pCurrentDoc = pOldActiveView->GetDocument();
pNewActiveView->Create(NULL, NULL, WS_BORDER,
CFrameWnd::rectDefault, this, nView, &context);
pNewActiveView->OnInitialUpdate();
}
SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
pOldActiveView->SetDlgCtrlID(
pOldActiveView->GetRuntimeClass() ==
RUNTIME_CLASS(CStringView) ? STRING : HEX);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();
}----------------------
May you succeed!
------------------------
BOOL m_IsSplitter;
BOOL m_bToggle;在构造函数中进行初始化
m_bToggle = TRUE;
m_IsSplitter = FALSE;创建Splitter
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
RECT rc;
int FrmW,FrmH;
GetClientRect(&rc);
FrmW = rc.right - rc.left + 1;
FrmH = rc.bottom - rc.top + 1;
//VERIFY
m_wndSplitter.CreateStatic(this, 2, 1);
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSppMuView),
CSize(FrmW,FrmH/2), pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CBottomView),
CSize(0,0), pContext); m_IsSplitter = TRUE; //注意一下,呵呵
return TRUE;
}在工具栏添加一个按钮为其添加消息映射,其函数如下
void CChildFrame::OnExchange()
{
// TODO: Add your command handler code here
HWND hWnd = m_wndSplitter.GetSafeHwnd();
if( hWnd == NULL || !::IsWindow(hWnd) )
{
return;
}
m_bToggle = !m_bToggle; CRect rc;
this->GetClientRect(&rc); int cyCur, cyMin;
m_wndSplitter.GetRowInfo( 0, cyCur, cyMin ); if(m_bToggle)
{
//two view
m_wndSplitter.SetRowInfo( 0, rc.Height() / 2, cyMin );
}
else
{
//one view
m_wndSplitter.SetRowInfo( 0, rc.Height(), cyMin );
}
m_wndSplitter.RecalcLayout();
}
在ChildFrame中重载OnSize
void CChildFrame::OnSize(UINT nType, int cx, int cy)
{
CMDIChildWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(!m_IsSplitter)
return; CRect rc;
this->GetClientRect(&rc);
int cyCur, cyMin;
m_wndSplitter.GetRowInfo( 0, cyCur, cyMin );
if(m_bToggle)
{
//two view
m_wndSplitter.SetRowInfo( 0, rc.Height() / 2, cyMin );
}
else
{
//one view
m_wndSplitter.SetRowInfo( 0, rc.Height(), cyMin );
}
m_wndSplitter.RecalcLayout();
}
http://expert.csdn.net/Expert/topic/2193/2193941.xml?temp=.3967249
应该和你的问题差不多----------------------
May you succeed!
------------------------
enjoy it!