荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: 3.4 文档,视,框架之 间相互作用
发信站: 荔园晨风BBS站 (Wed May 30 01:19:48 2001), 转信

3.4 文档,视,框架之间相互作用

一般来说用户的输入/输出基本都是通过视进行,但一些例外的情况下可能需要和框架直
接发生作用,而在多视的情况下如何在视之间传递数据。

在使用菜单时大家会发现当一个菜单没有进行映射处理时为禁止状态,在多视的情况下
菜单的状态和处理映射是和当前活动视相联系的,这样MFC可以保证视能正确的接收到各
种消息,但有时候也会产生不便。有一个解决办法就是在框架中对消息进行处理,这样
也可以保证当前文档可以通过框架得到当前消息。

在用户进行输入后如何使视的状态得到更新?这个问题在一个文档对应一个视图时是不
存在的,但是现在有一个文档对应了两个视图,当在一个视上进行了输入时如何保证另
一个视也得到通知呢?MFC的做法是利用文档来处理的,因为文档管理着当前和它联系的
视,由它来通知各个视是最合适的。让我们同时看两个函数:
void CView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint )
void CDocument::UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject*
pHint = NULL )

当文档的UpdateAllViews被调用时和此文档相关的所有视的OnUpdate都会被调用,而参
数lHint和pHint都会被传递。这样一来发生改变视就可以通知其他的兄弟了。那么还有
一个问题:如何在OnUpdate中知道是那个视图发生了改变呢,这就可以利用pHint参数,
只要调用者将this指针赋值给参数就可以了,当然完全可以利用该参数传递更复杂的结
构。

视的初始化,当一个文档被打开或是新建一个文档时视图的CView::OnInitialUpdate()
会被调用,你可以通过重载该函数对视进行初始化,并在结束前调用父类的OnInitialU
pdate,因为这样可以保证OnUpdate会被调用。

文档中内容的清除,当文档被关闭时(比如退出或是新建前上一个文档清除)void CDo
cument::DeleteContents ()会被调用,你可以通过重载该函数来进行清理工作。
在单文档结构中上面两点尤其重要,因为软件运行文档对象和视对象只会被产生并删除
一次。所以应该将上面两点和C++对象构造和构析分清楚。

最后将一下文档模板(DocTemplate)的作用,文档模板分为两类单文档模板和多文档模
板,分别由CSingleDocTemplate和CMultiDocTemplate表示,模板的作用在于记录文档,
视,框架之间的对应关系。还有一点就是模板可以记录应用程序可以打开的文件的类型
,当打开文件时会根据文档模板中的信息选择正确的文档和视。模板是一个比较抽想的
概念,一般来说是不需要我们直接进行操作的。

当使用者通过视修改了数据时,应该调用GetDocument()->SetModifiedFlag(TRUE)通知
文档数据已经被更新,这样在关闭文档时会自动询问用户是否保存数据。
好象这一节讲的有些乱,大家看后有什么想法和问题请在VCHelp论坛上留言,我会尽快
回复并且会对本节内容重新整理和修改。

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店