MFC浅析(3) 文档视图结构中命令的处理流程

原创 2001年06月16日 12:59:00
文档视图结构中命令的处理流程

文档视图结构中命令的处理流程

FMD(http://www.fmdstudio.net)

(以MDI文档视图结构为例)

在应用程序的界面上,包含菜单、工具条等元素,当选取这些元素后,将发送一个命令给程序。 同时,还有命令发送的其它形式,例如快捷键等等。

在文档视图结构中,程序包括一个主框架窗口,而具体打开的文件则包括其数据对象(CDocument) 表现形式(CView),和窗口容器(CFrameWnd)等几个相关对象。命令发送后,将按照一定的流向传达 给指定的对象,由对象内成员函数响应解决。

一 命令的发送

在菜单或工具条上按下某项,(或按了对应的热键)将向窗口发送一个WM_COMMAND消息

WM_COMMAND 参数包括3部分:
 wNotifyCode = HIWORD(wParam); // 来源类型 
 wID = LOWORD(wParam);         // 命令ID
 hwndCtl = (HWND) lParam;      // 来源窗口

其中最重要的就是wID,它就是具体的命令。数值就是菜单项、工具按钮、或按键组合的ID_?????。

在CWnd对象中,WM_COMMAND由OnCmdMsg()响应处理。

在MFC程序框架中,OnCmdMsg()当前将命令按特定流程发送给特定的对象处理。

二 命令ID

通常,命令ID 的数值范围为:0x8000 -> 0xDFFF

// 8000 -> DFFF : user commands
// E000 -> EFFF : AFX commands and other things
// F000 -> FFFF : standard windows commands and other things etc
 // E000 -> E7FF standard commands
 // E800 -> E8FF control bars (first 32 are special)
 // E900 -> EEFF standard window controls/components
 // EF00 -> EFFF SC_ menu help
 // F000 -> FFFF standard strings

三 命令的流向

命令发送之初,是作为WM_COMMAND消息的参数传给当前窗口。

如果没有打开文件,则WM_COMMAND发送给父窗口(CMDIFrameWnd)

如果有文件打开过,则WM_COMMAND发送给激活的子框架窗口CMDIChildWnd)

另外CView,CWinApp,CDocument都是从CCmdTarget派生,都能响应命令,但它们不响应一般的窗口消息。

在CMDIFrameWnd和CMDIChildWnd中的OnCmdMsg()将根据需要转发给CWinApp、CView或CDocument。

在这些类的基类CCmdTarget中OnCmdMsg将查找该类各层次的消息映射项,查找处理函数。

(1)若没有文件打开,即只有主框架

概要: 在主框架内查命令处理,若未找到,交由应用程序类处理。

命令流向:主框架->应用程序类。

具体流程:

①调用CMDIFrameWnd::OnCmdMsg

{
 if(有子框架)
 {
  交给子框架处理;CMDIChildWnd::OnCmdMsg
  return;
 }
 CFrameWnd::OnCmdMsg 
 return;
}

②CFrameWnd::OnCmdMsg为:

{
 ....
 由基类的OnCmdMsg处理,若框架中有该命令的处
 理函数,函数将返回
 if(CWnd::OnCmdMsg)
  return;
 //如果在框架中没有处理,就交给应用程序类处理命令
 CWinApp::OnCmdMsg
}

③若在框架中没有处理该命令,转交CWinApp处理。

CWinApp::OnCmdMsg

(2)有打开的文档,存在子框架、视图对象,文档对象

命令流向:子框架接收到命令->视图对象处理->文档对象处理->文档模板处理 ->子框架处理->应用程序对象处理

若在某一级被处理,则流程跳出。

具体流程:

WM_COMMAND 发送到子框架,在CMDIChildWnd::OnCmdMsg中包含下面步骤:

①先让子框架上激活的视图对象处理

执行CView::OnCmdMsg

调用基类的OnCmdMsg,查找并执行命令处理,

若未找到,交给文档对象来处理命令

②执行CDocument::OnCmdMsg

在文档对象中查找命令处理函数。

若未找到,交由文档模板处理。

③执行CDocTemplate::OnCmdMsg

若命令未处理,返回到子框架,子框架处理

④子框架基类::OnCmdMsg执行

若命令未处理,交由应用程序对象处理

⑤执行CWinApp::OnCmdMsg

版权声明:本文为博主原创文章,未经博主允许不得转载。

MFC的单文档视图结构(摘录)

文档        文档对象用于管理和维护数据,包括保存数据、取出数据以及修改数据等操作,在数据被修改以后,文档可以通知其对应的所有视图更新显示。    视图        视图对象...
  • qqqren
  • qqqren
  • 2016年11月25日 10:52
  • 349

MFC文档视图结构学习笔记

文档/视图概述 为了统一和简化数据处理方法,Microsoft公司在MFC中提出了文档/视图结构的概念,其产品Word就是典型的文档/视图结构应用程序 MFC通过其文档类和视图类提供了大量有关...
  • lindagod
  • lindagod
  • 2015年03月15日 07:44
  • 3472

深入浅出MFC文档/视图架构之基本概念

深入浅出MFC文档/视图架构之基本概念 引言   MFC引入了"文档/视图"结构的概念,理解这个结构是编写基于MFC编写复杂Visual C++程序的关键。"文档/视图"中主要...
  • z215367701
  • z215367701
  • 2016年04月04日 19:36
  • 1701

[MFC]文档视图体系结构、单文档界面

1. 文档视图结构:     1) 是MFC的一种模块化设计思想的产物,要求程序的数据和表现数据的视图分开来处理;     2) 数据以文档的形式表现,文档可以存储在磁盘中永久保存也可以被程序读出并进...
  • Lirx_Tech
  • Lirx_Tech
  • 2015年09月20日 20:25
  • 1628

文档视图结构

一、概述 文档/视图结构是在Visual C 中使用MFC开发基于文档的应用程序的基本框架。在这个框架中,数据的维护及显示分别由两个不同但又彼此紧密相关的对象――文档和视图负责的。具体地说,用户...
  • iamherego
  • iamherego
  • 2015年10月16日 11:08
  • 1164

MFC文档视图(一):简介

刚一接触MFC还真有点让人不所措,不知道如何下手.用向导生成一个简单的SDI项目,自动生成一堆代码.看着有点云里雾里的.这主要有下面一些让人晕乎的地方. 1.不容易理解程序的入口点.学C的话看代码都...
  • weiwenhp
  • weiwenhp
  • 2013年03月06日 17:25
  • 4039

初识MFC文档视图程序中多视图间的数据交互

初识MFC文档视图程序中多视图间的数据交互 最近又在MFC下折腾了,折腾了一天做了个分隔窗口的单文档视图程序,分隔出了2个窗口,每个窗口都放了一个CFormView视图。接着就需要考虑这两个CF...
  • komtao520
  • komtao520
  • 2015年10月23日 11:28
  • 1081

单文档多视图切换方法

摘要:本文通过一个程序实例描述了在VC 6.0(vc2008可行)下如何在单文档程序中通过菜单动态控制多  个窗体的切换。     一、 引言     我们在编制程序中根据需求的不同会在...
  • foreverhuylee
  • foreverhuylee
  • 2014年10月12日 21:09
  • 5325

MFC单文档多视图的切换的3种实现

MFC单文档多视图的切换的3种实现 MFC建立程序工程向导时最后一步,选择CFormView作为View的基类。 假设工程名称为CMySingleDoc。 默认生成的View类名为:...
  • lx624909677
  • lx624909677
  • 2015年04月27日 09:48
  • 3006

MFC Windows程序设计--多文档多视图

MDI: 一个文档多个视图 多个打开的文档 多个文档类型MDI允许同时打开多个文档,SDI一个。 MDI支持多个文档类型。SDI一个。 MDI有多个菜单。SDI一般只有一个。 MDI有一个...
  • x13262608581
  • x13262608581
  • 2017年04月16日 07:50
  • 431
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC浅析(3) 文档视图结构中命令的处理流程
举报原因:
原因补充:

(最多只允许输入30个字)