100分请教高手:单文档程序中怎样实现切分视图的自由切换?? 见标题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //in MainFrm.h CSplitterWnd m_wndSplitter1; CSplitterWnd m_wndSplitter2;//CMyTreeView::CFormView,CFileListForm::CFormView,CItemAttrForm::CFormViewBOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { CRect rect; GetClientRect(&rect); if( !m_wndSplitter1.CreateStatic( this, 1, 2 ) ) return FALSE; if( !m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(0,0), pContext) ) return FALSE; if( !m_wndSplitter2.CreateStatic( &m_wndSplitter1, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,1) ) ) return FALSE; if( !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CFileListForm), CSize(0,0), pContext) ) return FALSE; if( !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CItemAttrForm), CSize(0,0), pContext) ) return FALSE;}//以上可以生成比较经典的分割视图 | | |_______________ | | |//换左边的视图CNewView::CFormViewm_wndSplitter1.DeleteView(0,0); if( !m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CNewView), CSize(0,0), pContext) ) 可以用隐藏的方式来进行切换。给我发邮件,我给你个例子。我在我的程序中已经应用起来了。[email protected] 参考MFC精典问答FAQ3.8//1.查找要替换的视图//2.保存当前视图的位置和活动状态//3.查找相关的文档//4.当释放活动视图时,确保文档不会自动析构//5.释放活动视图//6.恢复文档到初始状态//7.初始化CreateView使用的创建上下文//8.创建新的视图//9.定位新视图//10.给视图发送WM_INITIALUPDATE消息 可以使用一个隐藏/显示某页的splitterwnd来控制 参考view/doc框架,以及相互协作关系,推荐看《深入解析MFC》(虽然是MFC4.0的)另外你说的切换在msdn中有源代码!哈哈,自己找吧! SetActiveView((CView*)m_wndCDlabel.GetPane(0,0)); 多谢各位的指点,我终于找到了办法,在这里与大家分享,各位有什么好的建议请提出,本贴咱不结贴。BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { CRect rect; GetClientRect(&rect); m_pWndSplitter1 = new CCJFlatSplitterWnd(); m_pWndSplitter2 = new CCJFlatSplitterWnd(); if( !m_pWndSplitter1->CreateStatic( this, 1, 2 ) ) return FALSE; if( !m_pWndSplitter1->CreateView(0, 0, RUNTIME_CLASS(CSubStationServerLeftView), CSize(100,0), pContext) ) return FALSE; if( !m_pWndSplitter2->CreateStatic( m_pWndSplitter1, 1, 2, WS_CHILD | WS_VISIBLE, m_pWndSplitter1->IdFromRowCol(0,1) ) ) return FALSE; if( !m_pWndSplitter2->CreateView(0, 0, RUNTIME_CLASS(CSubStationTreeView), CSize(100,0), pContext) ) return FALSE; if( !m_pWndSplitter2->CreateView(0, 1, RUNTIME_CLASS(CSubStationListView), CSize(100,0), pContext) ) return FALSE; return TRUE;}void CMainFrame::SwitchView(enum CMainFrame::eView eView){ CSubStationServerLeftView * pLeftView = (CSubStationServerLeftView * )m_pWndSplitter1->GetPane(0,0); if (pLeftView == NULL) return; CCreateContext context; context.m_pCurrentDoc = pLeftView->GetDocument(); switch(eView) { case EVIEWUSER { CWnd * pWnd = m_pWndSplitter1->GetPane(0,1); if (pWnd != NULL) { if (pWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd))) { delete pWnd; m_pWndSplitter2 = NULL; if( !m_pWndSplitter1->CreateView(0, 1, RUNTIME_CLASS(CUserListView), CSize(100,0), &context) ) return; } else if (pWnd->IsKindOf(RUNTIME_CLASS(CUserListView))) break; } m_pWndSplitter1->RecalcLayout( ); } break; case EVSUBSTATION { CWnd * pWnd = m_pWndSplitter1->GetPane(0,1); if (pWnd != NULL) { if (pWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd))) { delete pWnd; m_pWndSplitter2 = NULL; } else if (pWnd->IsKindOf(RUNTIME_CLASS(CUserListView))) delete pWnd; } m_pWndSplitter2 = new CCJFlatSplitterWnd(); if( !m_pWndSplitter2->CreateStatic( m_pWndSplitter1, 1, 2, WS_CHILD | WS_VISIBLE, m_pWndSplitter1->IdFromRowCol(0,1) ) ) return; if( !m_pWndSplitter2->CreateView(0, 0, RUNTIME_CLASS(CSubStationTreeView), CSize(100,0), &context) ) return; if( !m_pWndSplitter2->CreateView(0, 1, RUNTIME_CLASS(CSubStationListView), CSize(100,0), &context) ) return; m_pWndSplitter1->RecalcLayout( ); } break; case EVIED break; case EVDICT: break; default: ASSERT(FALSE); }}////以次方便可以实现复杂的分割、切换 CoCreateInstance这个函数里的参数怎么传,求指导 求助,使用ATL开发基于Edit的控件不能设置文本自动滚动. CFileDialog读入多个文件时的DoModal()的返回问题 求VC中各种控件的入门级使用资料 单色位图的大小,引起bmicolour编码(0,1)方式改变? 关于filetime结构 谁能提供install shield6.22的汉化版或汉化补丁、教程也可以? 救急~~紧急 请教一个VC++中访问成员变量的问题? 有没有反编译OCX软件??? 请问在windows2000下如何获取cpu的利用率以及内存的利用率? 怎样才能获取窗口的指针???
CSplitterWnd m_wndSplitter1;
CSplitterWnd m_wndSplitter2;
//CMyTreeView::CFormView,CFileListForm::CFormView,CItemAttrForm::CFormView
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CRect rect;
GetClientRect(&rect);
if( !m_wndSplitter1.CreateStatic( this, 1, 2 ) )
return FALSE;
if( !m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(0,0), pContext) )
return FALSE;
if( !m_wndSplitter2.CreateStatic( &m_wndSplitter1, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,1) ) )
return FALSE;
if( !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CFileListForm), CSize(0,0), pContext) )
return FALSE;
if( !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CItemAttrForm), CSize(0,0), pContext) )
return FALSE;
}
//以上可以生成比较经典的分割视图
|
|
|_______________
|
|
|
//换左边的视图CNewView::CFormView
m_wndSplitter1.DeleteView(0,0);
if( !m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CNewView), CSize(0,0), pContext) )
[email protected]
{
CRect rect;
GetClientRect(&rect);
m_pWndSplitter1 = new CCJFlatSplitterWnd();
m_pWndSplitter2 = new CCJFlatSplitterWnd();
if( !m_pWndSplitter1->CreateStatic( this, 1, 2 ) )
return FALSE;
if( !m_pWndSplitter1->CreateView(0, 0, RUNTIME_CLASS(CSubStationServerLeftView), CSize(100,0), pContext) )
return FALSE;
if( !m_pWndSplitter2->CreateStatic( m_pWndSplitter1, 1, 2, WS_CHILD | WS_VISIBLE, m_pWndSplitter1->IdFromRowCol(0,1) ) )
return FALSE;
if( !m_pWndSplitter2->CreateView(0, 0, RUNTIME_CLASS(CSubStationTreeView), CSize(100,0), pContext) )
return FALSE;
if( !m_pWndSplitter2->CreateView(0, 1, RUNTIME_CLASS(CSubStationListView), CSize(100,0), pContext) )
return FALSE;
return TRUE;
}
void CMainFrame::SwitchView(enum CMainFrame::eView eView)
{
CSubStationServerLeftView * pLeftView = (CSubStationServerLeftView * )m_pWndSplitter1->GetPane(0,0);
if (pLeftView == NULL)
return;
CCreateContext context;
context.m_pCurrentDoc = pLeftView->GetDocument();
switch(eView)
{
case EVIEWUSER
{
CWnd * pWnd = m_pWndSplitter1->GetPane(0,1);
if (pWnd != NULL)
{
if (pWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd)))
{
delete pWnd;
m_pWndSplitter2 = NULL;
if( !m_pWndSplitter1->CreateView(0, 1, RUNTIME_CLASS(CUserListView), CSize(100,0), &context) )
return;
}
else if (pWnd->IsKindOf(RUNTIME_CLASS(CUserListView)))
break;
}
m_pWndSplitter1->RecalcLayout( );
}
break;
case EVSUBSTATION
{
CWnd * pWnd = m_pWndSplitter1->GetPane(0,1);
if (pWnd != NULL)
{
if (pWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd)))
{
delete pWnd;
m_pWndSplitter2 = NULL;
}
else if (pWnd->IsKindOf(RUNTIME_CLASS(CUserListView)))
delete pWnd;
}
m_pWndSplitter2 = new CCJFlatSplitterWnd();
if( !m_pWndSplitter2->CreateStatic( m_pWndSplitter1, 1, 2, WS_CHILD | WS_VISIBLE, m_pWndSplitter1->IdFromRowCol(0,1) ) )
return;
if( !m_pWndSplitter2->CreateView(0, 0, RUNTIME_CLASS(CSubStationTreeView), CSize(100,0), &context) )
return;
if( !m_pWndSplitter2->CreateView(0, 1, RUNTIME_CLASS(CSubStationListView), CSize(100,0), &context) )
return;
m_pWndSplitter1->RecalcLayout( );
}
break;
case EVIED
break;
case EVDICT:
break;
default:
ASSERT(FALSE);
}}
////以次方便可以实现复杂的分割、切换