单文档工程中如何动态添加视图?

mark521 2004-12-07 08:47:08
首先谢谢CSDN中XDJM给我这些天给我地帮助,不过小弟才疏学浅,还是又不少问题,希望能得到各位地帮助。
我基于单文档建了一个工程,遇到如下问题:
1:现在要想通过菜单触发再建立一个视图,
2:希望该新建地视图中可以添加编辑框,按钮等控件
怎么做呢?
...全文
214 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kudeet 2004-12-07
  • 打赏
  • 举报
回复
http://www.czvc.com/code/MultiView1.rar
Kudeet 2004-12-07
  • 打赏
  • 举报
回复
在一些情况下,应用程序有许多信息要显示,当一个窗口内显示不下时,VC提供的MDI应用程序可以解决这个问题,但是如果应用程序只是对单个文档,采用多种方式显示,则采用SDI更合适。那么,如何在单文档应用程序中实现多视图呢?缺省情况下,派生类的构造函数是pretected类型的,必须将它改为public类型,因为我们将会动态生成派生视图类并切换活动的视图。也可以一次生成所有的视图,但是这样造成系统资源的极大浪费。

1 首先利用资源编辑器新建4个对话框,在对话框中添加需要的控件,各个对话框的ID分别为IDD_MULTIVIEW_FORM,IDD_MULTIVIEW_FORM2,IDD_MULTIVIEW_FORM3,IDD_MULTIVIEW_FORM4

2 为每一个对话框创建一个CFormView类的派生类,分别为:CView1,CView2,CView3,CView4

3 在应用程序的初始化文件中用CView1替换原先的视图,这样程序启动后的缺省显示视图是CView1,修改后的部分代码如下:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMultiViewDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CView1));
AddDocTemplate(pDocTemplate);

4 利用资源编辑器,添加几个菜单,并添加相应的消息处理函数:
void CMainFrame::OnViewView1()
{
SwitchToForm(IDD_MULTIVIEW_FORM);
}

void CMainFrame::OnViewView2()
{
SwitchToForm(IDD_MULTIVIEW_FORM2);
}

void CMainFrame::OnViewView3()
{
SwitchToForm(IDD_MULTIVIEW_FORM3);
}

void CMainFrame::OnViewView4()
{
SwitchToForm(IDD_MULTIVIEW_FORM4);
}

在SDI中CFrame的派生类即CMainFrame控制着所有的视图,而且它允许用户通过消息处理进行视图的切换。进行视图切换的原理很简单,只是断开和旧视图的连接并把他删除,创建一个新视图,将文档和它相连,设置几个标志,然后显示新视图,SwitchToForm函数是进行视图切换的代码函数。

void CMainFrame::SwitchToForm(int nForm)
{
//CDocument* pDoc = GetActiveDocument();
CView *pOldActiveView=GetActiveView(); //保存旧视图
CView *pNewActiveView=(CView*)GetDlgItem(nForm); //取得新视图
if(pNewActiveView==NULL)
{
switch(nForm)
//这些ID是对话框的标志符,但也可以用其他的标志
{
case IDD_MULTIVIEW_FORM :
pNewActiveView=(CView*)new CView1;
break;
case IDD_MULTIVIEW_FORM2 :
pNewActiveView=(CView*)new CView2;
break;
case IDD_MULTIVIEW_FORM3 :
pNewActiveView=(CView*)new CView3;
break;
case IDD_MULTIVIEW_FORM4 :
pNewActiveView=(CView*)new CView4;
break;
}
CCreateContext context; //将文挡和视图相连
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD ,
CFrameWnd::rectDefault, this, nForm, &context);


pNewActiveView->OnInitialUpdate();
}
SetActiveView(pNewActiveView); //改变活动的视图
pNewActiveView->ShowWindow(SW_SHOW); //显示新的视图
pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图

if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView1))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM);

else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView2))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM2);

else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView3))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM3);

else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView4))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM4);

pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);



delete pOldActiveView; //删除旧视图

RecalcLayout(); //调整框架窗口
}

bobob 2004-12-07
  • 打赏
  • 举报
回复
想在试图里面做那些东西可以自己create,然后添加消息影射

不明白你的意思,添加一个试图?代替原来的吗?那你还不如直接在原来的上面做
两个放在一起吗?那你就分割视图啊?
handwolf 2004-12-07
  • 打赏
  • 举报
回复
不要创建视图了,
非模太显示一个对话框就可以了
对话框上你想放什么就放什么!

16,472

社区成员

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

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

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