如何发送命令到文档对象

2016-01-29 11:51 7 1 收藏

如何发送命令到文档对象,如何发送命令到文档对象

【 tulaoshi.com - C语言心得技巧 】

如何发送命令到文档对象 赵湘宁 本文范例代码:Doctime1.zip Doctime2.zip 问题: 我编了一个类似Windows 2000 上性能监视器的程序。在这个程序中,我创建了一个文档对象和几个视图。文档对象负责有规律地采集数据,然后通知相关的视图以不同的格式显示这些数据。文档对象为了有规律地采集数据,它需要一个定时(time)事件。但是,文档不是一个基于窗口的对象,所以它没有这样的定时事件。我权衡了三种解决方案: 在其中的一个视图中创建定时器。当事件发生时通知文档对象获取数据。 为每一个文档(或在每个文档内)创建一个单独的线程,以便这个线程能有规律地创建时间事件。 在CMainFrame中创建一个定时器并从中调用文档函数 这三种方法我都不满意。能否给出一种更好的解决方案? 解答: 在你列出的解决方案中,将定时器放入视图是最糟的想法,因为那样的话你就得为每个视图建一个定时器,你应该将定时器视为一种相对有限的资源(这一点在过去尤其如此,现在这个问题考虑得较少)。创建单独的线程对于定时器这样简单的东西又有牛刀弑鸡之嫌。线程无疑使事情复杂化。那么还有第三个方案:在主框架中创建定时器并从中调用文档函数。我会告诉你如何用这个方案直截了当地实现所要的功能,然后我还会展示另外一种你没有想到的方法。
假设你不愿意用第三种方案的原因是它需要从主框架中调用文档,这样做有点丑陋。(为什么框架要掺乎到文档中去呢?)但有一种直截了当的方法来做,不用直接调用CMyDoc::DoTimerThing,你可以将WM_TIMER消息转换成一个ID为ID_APPTIMER的WM_COMMAND,并用通常的方式广播这个命令以便文档能用ON_COMMAND处理它,文档无法处理所有的窗口消息,但它们可以处理WM_COMMAND。事实上,这是MFC命令处理例程体系结构的主要创新之一,它使非窗口对象可以处理命令。所以这样看来,你要做的事情就是:
//CMainFrame::OnTimer(...){   SendMessage(WM_COMMAND, ID_APPTIMER);}//
也就是说,当主框架得到定时器信号的同时,也向自己发送了一个ID_APPTIMER命令。MFC会将这个命令发送到系统,任何具有ON_COMMAND处理器并能处理ID_APPTIMER命令的对象都可以处理这个事件。你可以用ON_COMMAND_EX来对付多个对象处理相同事件的情况。
这样做虽然能行得通,但有一个问题。MFC只把命令发送到活动视图/文档。如果其它文档处于打开状态,但没有被激活,则它们不会得到WM_COMMAND消息。虽然你可以修改程序把命令广播到非激活文档,但那样的话,像“文件|保存”这样普通的命令会被发送到所有的文档——很狼狈!因为我们只需要定时器命令到达所有文档。怎么办呢?如何发送WM_COMMAND到所有的文档?
MFC将命令发送到文档这样的非窗口对象,其方法是通过虚函数CCmdTarget::OnCmdMsg来实现的。当窗口获得WM_COMMAND消息时,它要运行许多CWnd代码和虚函数。最终,控制到达CWnd::OnCommand,由它调用OnCmdMsg。
// in CWnd::OnCommandOnCmdMsg(nID, CN_COMMAND, NULL, NULL);//
这里,nID是命令ID,编码CN_COMMAND告诉OnCmdMsg这是个命令事件——与更新UI事件相对(此时编码应该是CN_UPDATE_COMMAND_UI)。其它参数对于CN_COMMAND没用。
因此,如果你有一个文档指针,并想要发送一个命令到该文档,那么你要做的全部工作就是调用:
//pDoc->OnCmdM
                        

来源:http://www.tulaoshi.com/n/20160129/1483615.html

延伸阅读
标签: Web开发
Document文档对象是JavaScript中window和frames对象的一个属性,是显示于窗口或框架内的一个文档。描述当前窗口或指定窗口对象的文档。它包含了文档从head到/body的内容。 用法:document (当前窗口) 或 窗口对象.document (指定窗口) 属性: document.title //设置文档标题等价于HTML的title标签 documen...
易信怎么发送文件到电脑   第一步下载易信: 第二步打开易信点击发现: 第三步选择更多功能: 第四步选择传文件到电脑 第五步点击右下角+选择对应的文件即可
下面是一个将数据直接发送到打印机的示例: 记得在文件中加上#include winspool.h bool Print(char* szPrinterName, char* szBuffer)// szBuffer是我们希望发送到打印机的数据缓冲 { HANDLE hPrinter; //打印机句柄 int iLen = strlen(szBuffer);// 发送数据的长度 DWORD dwWritten; // 已经向打印机写了多少 if(OpenPrinter(sz...
标签: autocad教程
13.7.1 图像的显示控制 对于图像对象,用户同样可以定义剪裁边界来控制其显示范围。该命令的调用方式为: 工具栏:“Reference参照”→ 菜单:【Modify(修改)】→【Clip(裁剪)】TuLaoShi.com→【Image(图像)】 快捷菜单:选定图像对象后单击右键,选择“Image(图像)”→“Clip(裁剪)” 命令行:image...
文档对象模型 (DOM) 是一个文档标准,对于完备的文档和复杂的应用程序,DOM 提供了大量灵活性。DOM标准是标准的。它很强壮且完整,并且有许多实现。这是许多大型安装的决定因素--非凡是对产品应用程序,以避免在API发生改变时进行大量的改写。 !-- frame contents -- !-- /frame contents -- 以上是我在选择处理XML数据时...

经验教程

545

收藏

68
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部