MDI单文档多视图的文档处理

Gushleo 2010-05-03 05:19:55
我用MDI做了个单文档多视图的界面
引用了3个模板 子窗口的VIEW类都是FormView类
m_Doc为CPtrArray 存储的是当前活动的文档

下面是将子窗口链接至文档其中一个的函数
void CEB666App::On11()
{
if(p11Frame!=NULL)
{
p11Frame->MDIActivate();
return ;
}
m_pdoc =(CMyownDoc *) m_Doc.GetAt(1);
CDocTemplate *pDocTemplate = p11Template;
p11Frame= (CChildFrame *)pDocTemplate->CreateNewFrame(m_pdoc,NULL);
pDocTemplate->InitialUpdateFrame(p11Frame,m_pdoc);
}


想问一下 如何才能将多个子窗口视图对应的文档正确保存啊

我关闭所有子窗口时 似乎文档也被关闭了 再重新打开一个子窗口就出错中止运行

另外菜单打开、 保存也不能正常使用了 要如何更改比较好a

每天晚上持续关注。

...全文
988 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdsnpeter 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gushleo 的回复:]
to xianglitian:
是因为我把所有模板的资源都指向IDR_MAINFRAME了吧
没去注意它

to xyzhaopeng:
架构是有问题
因为我没办法用SDI做出树视图来控制多个子窗口
子窗口应该是只有MDI才有吧
你是说所有的新建 打开i保存 都自己序列化?
那个工作量不是太大了
数据量很多啊 而且所有数据的处理都要在文档……
[/Quote]
我的意思是,你的需求,整个Application运行期,只有一份文档(一个Document实例),那这种情况下,使用MDI机制就不大好改成你的需求了。

因此我给你建议一个替代方案。此方案,具有一份全局数据m_AppData,这是一个Class,自己负责序列化自己。
其实工作量和你在Document中序列化一样,为什么呢?因为Document中你自己的数据照样要写序列化函数,每一个要保存下来的Document的Member,你都要序列化。

而我的建议,你只需要在Document序列化的时候,调用Document中的C_MyAPPData* 的序列化即可。

建议而已,你用或不用全在你自己权衡。
Gushleo 2010-05-11
  • 打赏
  • 举报
回复

明白了
现在向别人请教了另一种方法
先试试
如果可以了 马上回来结贴
也有可能还有疑问需要解答啊 呵呵


cdsnpeter 2010-05-10
  • 打赏
  • 举报
回复
我是感觉你的程序有点怪。可能开始架构就是有问题的。
既然是一份资料,那就是单文档。

你想使用多视图,但是MDI的本意是多文档。
所以你的程序改起来很难达到你要的效果。
我曾经改了半个多小时,效果不明显。

我的想法是:
1,不使用文档来保存数据。
2,数据保存在第三方类中,比如C_MyAppData;
3, 给MainFrame增加一个Member,C_MyAppData m_myAppData;
OnCreate之时初始化这个成员变量。
4,文档类增加一个Member,C_MyAppData* m_pAppData;
每Create一个Document,就从MainFrame得到这个指针。可以写到Document的OnNewDocument,OnOpenDocument中。
5,不去设置Document的Modified Flag,MainFrame响应ID_FILE_SAVE,处理这个消息。
6,你的视图类UI操作,实际影响Document的m_pAppData;m_pAppData增加一个Modified Flag标志。
7,C_MyAppData可以序列化,当然你也可以存储成文本文件(如INI文件)。

暂时就这么多。
Gushleo 2010-05-10
  • 打赏
  • 举报
回复


to xianglitian:
是因为我把所有模板的资源都指向IDR_MAINFRAME了吧
没去注意它

to xyzhaopeng:
架构是有问题
因为我没办法用SDI做出树视图来控制多个子窗口
子窗口应该是只有MDI才有吧
你是说所有的新建 打开i保存 都自己序列化?
那个工作量不是太大了
数据量很多啊 而且所有数据的处理都要在文档处理啊
非常多函数的 先试试吧

我找了个有实现 这个树形控制的程序
好像它能正常实现啊

个人觉得 这样的树形控制 应该有很多程序都有实现啊
不知道是不是我的 搜索方法有问题 查到的资料寥寥无几



向立天 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gushleo 的回复:]
to xyzhaopeng:

是的 我就是通过这样来实现 单文档多视图的

因为界面要做成MDI的 这样树形控制窗口的显示 子窗口实际会在增加


但是 这个 文档的保存 、打开、新建 不知道该怎么处理会好一些

要实现的是保存 能正确 把文档数据保存为磁盘文件

打开文件能正常吧数据读出 并用原来的那些窗口把数据显示出来(即刷新各视图的数据)
……
[/Quote]
不客气
东西我也看了
多文档我不熟
不过我提一个问题
如果我单纯编辑各个子窗口然后关闭子窗口
会提示我保存
这时我保存
然后我关闭主窗口仍然提示我保存
这时我不保存
再打开的时候通过文件打开我保存过的信息就可以看到上次编辑的效果了
Gushleo 2010-05-09
  • 打赏
  • 举报
回复
又沉了
自己顶下
希望能尽快得到解答
自己也在努力研究
cdsnpeter 2010-05-06
  • 打赏
  • 举报
回复
你似乎打算用一份Document来保存三个View中所有的数据?
cdsnpeter 2010-05-06
  • 打赏
  • 举报
回复
你的代码我看了下。架构奇怪。
我想弄明白,你现在需要实现怎样的一个功能?
把你的需求说清楚,从你的代码来看,架构很怪异。
Gushleo 2010-05-06
  • 打赏
  • 举报
回复
to xyzhaopeng:

是的 我就是通过这样来实现 单文档多视图的

因为界面要做成MDI的 这样树形控制窗口的显示 子窗口实际会在增加


但是 这个 文档的保存 、打开、新建 不知道该怎么处理会好一些

要实现的是保存 能正确 把文档数据保存为磁盘文件

打开文件能正常吧数据读出 并用原来的那些窗口把数据显示出来(即刷新各视图的数据)

新建的话 能正确创建一个新的文档把 原来的文档覆盖掉 刷新各视图的数据
以及打印 能把文档数据 打印出来(这个还没考虑要在哪里做)

to xianglitian:
谢谢版主的支持!
cdsnpeter 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gushleo 的回复:]

p11Template,p12Template,p13Template是在APP里定义的3个模板
以下示方式添加到模板列表中 然后通过前面所述初始化视图连接到同一文档指针m_pdoc上
似乎是因为所有链接的视图关闭了 文档被关闭 那个文档指针估计也找不到对象了
呵呵 没找到合适的保存文档的方法 vc还在入门中

p11……
[/Quote]
视图类,是用来显示Document内容的,所以不需要Serialize。
需要Serialize的是Document类。

看完了你的问题,说实话,还是没能明白你的问题,或者说你要实现的功能。
不介意的话,你把你的问题上传到Download区。我帮你调试看看。
向立天 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gushleo 的回复:]
那个错误问题 我通过使其中一个子窗口隐藏来解决
但是 打开 新建和 保存还是有问题



因为涉及到要保密的问题 所以无法提供源代码


但我晚上花了2小时
按照我逐步实现的操作写了个类似的代码

能否帮我调下 先谢谢了
在我的资源里

地址 http://download.csdn.net/source/2319365
[/Quote]

话都说到这份上了
就算不会也得下来看看
Gushleo 2010-05-05
  • 打赏
  • 举报
回复

那个错误问题 我通过使其中一个子窗口隐藏来解决
但是 打开 新建和 保存还是有问题



因为涉及到要保密的问题 所以无法提供源代码


但我晚上花了2小时
按照我逐步实现的操作写了个类似的代码

能否帮我调下 先谢谢了
在我的资源里

地址 http://download.csdn.net/source/2319365
尹成 2010-05-04
  • 打赏
  • 举报
回复
你可以给每个视图都关联文档,让文档完成。
用序列化保存:
重写每个类的序列化函数
最后在DOC里
void CTestDoc::Serialize(CArchive& ar) 
{
CMainFrame *pMainFrame=(CMainFrame *)AfxGetMainWnd();
m_Tree1=pMainFrame->GetTree1(); //树视图的指针
m_Tree2=pMainFrame->GetTree2();
m_List=pMainFrame->GetList(); //列表视图的指针
if (ar.IsStoring())
{
// TODO: add storing code here
m_Tree->Serialize(ar);
m_List->Serialize(ar);
}
else
{
// TODO: add loading code here
m_Tree->Serialize(ar);
m_List->Serialize(ar);
}
}
Gushleo 2010-05-04
  • 打赏
  • 举报
回复
对了 我视图中数据的处理 都是直接调用文档的数据成员变量直接修改的
这样应该可以不用再View类里设置Serialize吧

我使用打开按钮 打开一份保存的数据时
它会自动创建一个新的窗口来显示数据
如何能正确的把打开的文档设置为要用的文档来刷新视图呢?

如何能捕捉到 新建时新建的文档指针 和打开文件所获得的文档指针呢
在哪个位置实现??


补充说明下 我的 m_pdoc指针的获取是在App类里的InitInstance()
pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);
pMainFrame->UpdateWindow();
后 模板已经按照第一个文档模板建了一个视图的情况下获取的

m_pdoc = (CEB666Doc*)((CMainFrame*)AfxGetMainWnd())->MDIGetActive()->GetActiveView()->GetDocument();
m_Doc.InsertAt(1,m_pdoc,1);
Gushleo 2010-05-04
  • 打赏
  • 举报
回复
to xyzhaopeng

错误提示为 Debug Assertion Failed
File :doctempl.cpp
line: 248

这个貌似vc里的文件 应该不是那边出错
自己判断是模板调用时 文档指针找不到 出的问题
不清楚是不是?
Gushleo 2010-05-04
  • 打赏
  • 举报
回复



p11Template,p12Template,p13Template是在APP里定义的3个模板
以下示方式添加到模板列表中 然后通过前面所述初始化视图连接到同一文档指针m_pdoc上
似乎是因为所有链接的视图关闭了 文档被关闭 那个文档指针估计也找不到对象了
呵呵 没找到合适的保存文档的方法 vc还在入门中

p11Template = new CMultiDocTemplate(
IDR_MAINFRAME1,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CChildFrame), // main SDI frame window
RUNTIME_CLASS(C11View));
AddDocTemplate(p11Template);

本来是做成SDI 现在试着改成MDI 是用树形控制栏 来控制视图
树形控制栏已经解决 可以使用 就是数据文档类 不好处理
没想到还要改写 每个视图类的Serialize 我试试先吧
还不知道有没有好的例子提供下呢
cdsnpeter 2010-05-04
  • 打赏
  • 举报
回复
不太看得懂你的问题。你的错误如何提示的?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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