更新MFC中的视图,跟踪.NET Framework中的事件

本文配套源码

如何更新MFC中的视图?

如何跟踪.NET Framework 中的事件?

我在 MDI 程序中打算通过 CMainFrame 中的定时器事件来更新所有的子窗口。 视图用于显示许多图表。用如下的代码只能更新当前活动窗口:

GetActiveWindow()->GetActiveView()->GetDocument()

是否有其它的方法从 CMDIFrame 类中获得所有的子窗口或者所有的文档?

Makarand

你的情况并不罕见。许多采集实时数据的程序需要定时更新屏幕。即使你的程序不是采集实时数据,当用户的操作改变文档时,你一样要更新视图。MFC中doc/view模型(包括所有的object/view模型)的基本思想是数据与显示的分离。用户或者 实际事件改变了底层对象、数据或者文档,就会通过某些视图立即更新事件传递给显示机制。

对于同一个文档如果有数个视图,MFC已经有了一种机制一步到位地更新所有视图。这个函数就是CDocument::UpdateAllViews,它对打开文档的每 一个视图调用 CView::OnUpdate。你可以传递应用程序专用的,描述要执行哪一种更新操作的“提示”。例如,如果你知道仅仅是文档的标题改变了,你就可以定义一个枚举值 CHANGED_TITLE,将它作为 提示代码进行传递。如果你的文档包含了图片和文字,你可以定义枚举值 CHANGED_TEXT 和 CHANGED_GRAPHICS。这些 提示代码的目的是提高性能。通过“提示”来告诉视图什么东西改变了,这样就可以更智能地只重绘那些真正需要刷新的屏幕区域,从而避免潜在的耗时的绘制操作或屏幕闪烁。

UpdateAllViews 更新所有与某个文档关联的视图,但是如何更新所有的文档呢?MFC中没有UpdateAllDocuments 这样的函数,因此你需要自己列举所有的文档。这 就要求实现一个对文档模板和相关文档的循环操作,如下所示:

for (/* each CDocTemplate in app */) {
for (/* each CDocument in CDocTemplate */) {
// do something
}
}

既然列举文档是如此的有用,我写了一个很小的类 CDocEnumerator,隐藏了MFC中所有的模板和位置的机制。 实际上,这个类是我早在1995年9月写的——呵呵,这都几乎是十年前的事了。代码如 Figure 1 所示。 使用 CDocEnumerator 很容易在程序中列举所有打开的文档。

CDocEnumerator it;
CDocument* pdoc;
while ((pdoc=it.Next())!=NULL) {
// do something
}

还有什么比这个更容易?为了在实际的例子中示范这个类的用法,我写了一个小程序 UpdView,该程序将模拟实时数据采集程序。UpdView 中每个文档对其打开的秒数进行计数。Figure 2 显示了工作中的 UpdView。如果下载、生成并运行 UpdView,你便能看到每个视图每秒更新显示文档打开的秒数。在 Figure 2 中,名字为 file2.dat 的文档有两个视图,它们都显示同一个底层文档。每个文档维持自己的自打开后的时间数(数据),视图只是进行显示(表现)。在你自己的程序中,UpdView通过主框架的定时器设置工作。这个定时器处理事件使用 CDocEnumerator 告诉每一个文档收集更多的数据,如下面所示:

void CMainFrame::OnTimer(UINT_PTR nIDEvent) {
CDocEnumerator it;
CDocument* pdoc;
while ((pdoc=it.Next())!=NULL) {
((CMyDoc*)pdoc)->CollectMoreData();
}
}

Figure 2 运行中的UpdView

时间: 2024-10-03 22:37:13

更新MFC中的视图,跟踪.NET Framework中的事件的相关文章

MFC框架下 单文档视图中多视图切换问题

问题描述 MFC框架下 单文档视图中多视图切换问题 在MainFrm.cpp 里对主视图进行了切分 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs CCreateContext* pContext){ // TODO: Add your specialized code here and/or call the base class // CRect rc; // 获取框架窗口客户区的CRect对象 GetClientRect(&rc);

serialize函数重载-mfc文档视图框架下怎么实现对话框中数据的保存与打开

问题描述 mfc文档视图框架下怎么实现对话框中数据的保存与打开 在文档菜单栏上自己添加了一个对话框资源,并在对话框上添加了保存与打开按钮,想在对话框中重载文档serialize函数,但程序总是进不去,请问怎么实现? 解决方案 先看serialize是否有调用,然后就是对话框是否获取到数据 解决方案二: 程序进不去是什么意思.你不如重新用向导创建一次. 新建一个单文档程序,最后一步,从CFormView继承.重写OnNewDocument和OnOpenDialog

c++-MFC 单文档 多视图中各视图的创建顺序能否改变?

问题描述 MFC 单文档 多视图中各视图的创建顺序能否改变? 每个视图OnInitialupdate()的顺序能否改变? 我每个视图的创建顺序先后会互相影响,所以需要各视图能按我希望的顺序创建 我之前猜测CMainFrame::OnCreateClient中各视图的分割语句顺序可能影响其创建顺序,但是刚才调试发现貌似不是的.. 解决方案 将那些涉及顺序的代码从OnInitialupdate()提取出来,作为独立的函数. 定义一个全局变量,比如int steps=0 每个OnInitialupda

对ASP.NET MVC项目中的视图做单元测试

关于视图的单元测试 说到ASP.NET MVC,我们似乎始终都在关注对于Controller的测试--虽然Stephen Walther也写过如 何脱离Web Server对View进行单元测试,但是他的方法可看而不可用.复杂的构造和预备,以及对生成的 HTML字符串作判断--这真是在对视图做单元测试吗?仔细分析他的代码可以发现,这其实是在对 ViewEngine做单元测试.而且,如果真要对ViewEngine做单元测试,也不应该像他那样依赖外部文件.在 我看来,他的做法什么都不是--似乎美观,

【技术贴】MFC classview类视图消失的解决办法||一些常见的VC 2B问题

先说第一个,VC++6.0中,我们有时候引用其他工程对话框资源或者新定义变量的时候,它经常犯这种低级的2B错误,死活不显示类,搞得程序编译无法通过,可以理解,十年前能做成这样的IDE也已经很牛叉了.   MFC classview类视图消失的解决办法 最根本: 先关闭掉当前工程,保存好代码. 然后,在当前的文件目录下删除(ncb和opt文件),然后重新打开工程,就可以重新建立映射了. 解决办法1,是在VC中关闭工程,删除工程文件夹下的.ncb文件,再重新启动工程. 解决办法2,在fileview

mfc-怎么把MFC CTime类型变量插入数据库的datetime中?

问题描述 怎么把MFC CTime类型变量插入数据库的datetime中? UpdateData(true); ADOConn m_adoConn; m_AdoConn.OnInitADOConn(); _bstr_t sql; sql="select * from Records"; m_pRecordset=m_AdoConn.GetRecordSet(sql); int pos=m_ctrList.GetSelectionMark(); try { m_pRecordset-&g

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

        最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序,这里介绍两种在对话框picthre控件中显示BMP图片的最简单基础的方法.       ~~方法可能并不完美,高手忽略,但是提供一种能运行的方法,希望对刚接触这方面知识的同学有所帮助.可能你觉得文章过于简单或者有些过于详细叙述(点到即可我并不反对),但也为哪些入门同学想想,当初自己也是一头雾

在.NET Framework中轻松处理XML数据(四)

xml|数据 XmlTextWriter类用在本节中的方法创建XML文档显然并不困难.多年以来,开发者都是通过在缓存在连接一些字符串,连接好以后再把缓存中字符串输出到文件的方式来创建XML文档.但是以这种方式创建XML文档的方法只有在你保证字符串中不存在任何细小的错误的时候才有效..NET Framework通过用XMLwriter提供了更好的创建XML文档的方法. XML Writer类以只前(forward-only)的方式输出XML数据到流或者文件中.更重要的是,XML Writ

在.NET Framework中轻松处理XML数据(五)

xml|数据 设计XmlReadWriter类如前面所说,XML reader和Writer是各自独立工作的:reader只读,writer只写.假设你的应用程序要管理冗长的XML文档,且该文档有不确定的数据.Reader提供了一个很好的方法去读该文档的内容.另一方面,Writer是一个非常有用的用于创建XML文档片断工具,但是如果你想要它即能读,又能写,那么你就要用XMLDOM了.如果实际的XML文档非常庞大,又会出现了一个问题,什么问题呢?是不是把这个XML文档全部加载到内存中,然后进