请问一个单文档多视图的问题(不折分窗口)

CrazyAzreal 2005-06-12 01:49:58
在搜索了一吓``说可以创建视图``再通过ShowWindow来切换,我试了`总是有问题``郁闷``谁可以做个例子给我看看`谢谢`` 我的邮箱:crazyazreal@mail.csdn.net
...全文
128 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrazyAzreal 2005-06-13
  • 打赏
  • 举报
回复
不行。。我照着VC技术内幕里的例子做也不行`谁能帮我看看`
我的邮箱crazyazreal@mail.csdn.net
lj1006 2005-06-13
  • 打赏
  • 举报
回复
用Create和 DestroyWindow来切换
dasiu 2005-06-13
  • 打赏
  • 举报
回复
要实现单文档多VIEW可以有一下办法
1)建立单文档工程后:
分别用CDialog对话框定义dialogA,dialogB,dialogC等类;
在CView派生类初始化函数中,用create建立 dialogA,dialogb,dialogC的modless窗体,并按照当前CView的RECT,重新布局,(说白,就是把dialog放到CView视图上,覆盖这个视图)
在需要显示某个视图(对话框)的时候,将某个dialogA~C使用SW_SHOW,其它隐藏,实现了切换
在程序接受后,使用delete 函数,删除modless类
2)使用 CDOCUMENT的多VIEW特性:
以下是我曾经用过的例子。供参考。

//***************************************************************
//函数功能: 更具选择的视图资源ID号码改变视图
// 1) 取得当前DOC/FRAME/VIEW
// 2) 隐藏当前视图
// 3) 建立或激活新的视图
//
//说明:
//***************************************************************
BOOL CBTMSApp::ChangeView(UINT nID)
{
// TODO: Add your command handler code here
CMainFrame* pFrmWnd=(CMainFrame*)theApp.GetMainWnd();
CView *pActiveView=pFrmWnd->GetActiveView();
CView *pNewView=NULL;
BOOL bIsSameView=TRUE;//确定是否是同一个视图

CCreateContext context;
context.m_pCurrentDoc=pFrmWnd->GetActiveDocument();
context.m_pCurrentFrame=NULL;
context.m_pLastView=NULL;
context.m_pNewDocTemplate=NULL;
context.m_pNewViewClass=NULL;

switch(nID)
{
case IDD_GRAPH_MAIN:
if(!m_pViewBTMS)
{
pNewView=new CBTMSView;
pNewView->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewBTMS=(CBTMSView*)pNewView;
}
//判断当前和新的视图是否是同一个
if(m_pViewBTMS->GetSafeHwnd()!=pActiveView->GetSafeHwnd())
{
pFrmWnd->SetActiveView(m_pViewBTMS);
m_pViewBTMS->ShowWindow(SW_SHOW);
m_pViewBTMS->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
bIsSameView=FALSE;
}
break;
case IDD_GRAPH_TMPT:
if(!m_pViewGraphTmpt)
{
pNewView=new CGraphTppt;
pNewView->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewGraphTmpt=(CGraphTppt*)pNewView;
}
//判断当前和新的视图是否是同一个
if(m_pViewGraphTmpt->GetSafeHwnd()!=pActiveView->GetSafeHwnd())
{
pFrmWnd->SetActiveView(m_pViewGraphTmpt);
m_pViewGraphTmpt->ShowWindow(SW_SHOW);
m_pViewGraphTmpt->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
bIsSameView=FALSE;
}
break;
case IDD_GRAPH_ALARM:
if(!m_pViewGraphAlarm)
{
pNewView=new CGraphAlarm;
pNewView->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewGraphAlarm=(CGraphAlarm*)pNewView;
}
//判断当前和新的视图是否是同一个
if( m_pViewGraphAlarm->GetSafeHwnd()!=pActiveView->GetSafeHwnd())
{
pFrmWnd->SetActiveView(m_pViewGraphAlarm);
m_pViewGraphAlarm->ShowWindow(SW_SHOW);
m_pViewGraphAlarm->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
bIsSameView=FALSE;
}
break;
case IDD_HIST_TMPT:
if(!m_pViewHistTmpt)
{
pNewView=new CHistTmpt;
pNewView->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewHistTmpt=(CHistTmpt*)pNewView;
}
//判断当前和新的视图是否是同一个
if(m_pViewHistTmpt->GetSafeHwnd()!=pActiveView->GetSafeHwnd())
{
pFrmWnd->SetActiveView(m_pViewHistTmpt);
m_pViewHistTmpt->ShowWindow(SW_SHOW);
m_pViewHistTmpt->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
bIsSameView=FALSE;
}
break;
case IDD_HIST_EQUIP:
if(!m_pViewHistEquip)
{
pNewView=new CHistEquip;
pNewView->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewHistEquip=(CHistEquip*)pNewView;
}
//判断当前和新的视图是否是同一个
if(m_pViewHistEquip->GetSafeHwnd()!=pActiveView->GetSafeHwnd())
{
pFrmWnd->SetActiveView(m_pViewHistEquip);
m_pViewHistEquip->ShowWindow(SW_SHOW);
m_pViewHistEquip->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
bIsSameView=FALSE;
}
break;
case IDD_HIST_ALARM:
if(!m_pViewHistAlarm)
{
pNewView=new CHistAlarm;
pNewView->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewHistAlarm=(CHistAlarm*)pNewView;
}
//判断当前和新的视图是否是同一个
if( m_pViewHistAlarm->GetSafeHwnd()!=pActiveView->GetSafeHwnd())
{
pFrmWnd->SetActiveView(m_pViewHistAlarm);
m_pViewHistAlarm->ShowWindow(SW_SHOW);
m_pViewHistAlarm->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
bIsSameView=FALSE;
}
break;
case IDD_HIST_LOGNOTE:
if(!m_pViewHistLognote)
{
pNewView=new CHistLognote;
pNewView->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewHistLognote=(CHistLognote*)pNewView;
}
//判断当前和新的视图是否是同一个
if(m_pViewHistLognote->GetSafeHwnd()!=pActiveView->GetSafeHwnd())
{
pFrmWnd->SetActiveView(m_pViewHistLognote);
m_pViewHistLognote->ShowWindow(SW_SHOW);
m_pViewHistLognote->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
bIsSameView=FALSE;
}
break;
default:/*IDD_VIEW_COMMON*/
if(!m_pViewCommon)
{
pNewView=new CViewCommon;
pNewView->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewCommon=(CViewCommon*)pNewView;
}
//判断当前和新的视图是否是同一个
if(m_pViewCommon->GetSafeHwnd()!=pActiveView->GetSafeHwnd())
{
pFrmWnd->SetActiveView(m_pViewCommon);
m_pViewCommon->ShowWindow(SW_SHOW);
m_pViewCommon->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
bIsSameView=FALSE;
}
break;
}
if(!bIsSameView)
{
pActiveView->ShowWindow(SW_HIDE);
pActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST+100);
pFrmWnd->RecalcLayout();
}

return TRUE;
}


有问题,可以使用这个mrxwh@eyou.com和我联系。




uglystone 2005-06-12
  • 打赏
  • 举报
回复
看VC技术内幕文档视图篇
myhaocat 2005-06-12
  • 打赏
  • 举报
回复
干嘛在单文档里做多视图,费劲不?

不过可以自己Create一个。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧