第9章Windows程序设计的关键技术_第1页
第9章Windows程序设计的关键技术_第2页
第9章Windows程序设计的关键技术_第3页
第9章Windows程序设计的关键技术_第4页
第9章Windows程序设计的关键技术_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、事件驱动机制编程事件驱动机制编程组件对象模型组件对象模型MFCMFC上海大学机电工程与自动化学院 雷电 Windows程序和传统程序的根本区别:传统程序是通过调用系统函数来获得用户输入,而Windows程序是通过操作系统发送的消息来处理用户输入。 不了解事件编程编程就无法深入Windows程序和Web设计的殿堂。 面向对象的编程,要执行一个任务有两种启动方式:1.客户/服务器模式。2.委托/事件模式。上海大学机电工程与自动化学院 雷电 事件字面意义:事件可以是你认为的任何可能发生的事情。 事件:是事件源中的方法,该方法在被调用时生成事件,本质上是一种特殊的函数指针,通过调用事件方法“激发”该事

2、件。 事件源(事件发生器):是定义事件和包含事件的对象。 事件接收器:是接收事件的对象。 事件处理程序:是事件接收器中接收事件的方法。 挂钩事件(定阅事件):是指将事件与事件处理程序相关联。 解除挂钩事件(撤销定阅事件) :是指使事件与事件处理程序分离。 上海大学机电工程与自动化学院 雷电鼠标事件处理程序:OnClick客户定阅鼠标事件回调(通知)客户事件处理程序:OnSubmit定阅鼠标事件回调(通知)事件发生器事件ButtonClick最重要的意义是:事件源模块不用关心谁来响应事件,使系统间的模块间的关系是一种松散的关系。上海大学机电工程与自动化学院 雷电事件的处理主要有两种方法 委托式的

3、事件处理模式(函数回调,函数指针的集合) 类的层次体系的虚函数覆盖覆盖。(多态性)上海大学机电工程与自动化学院 雷电 VC+6.0没有提供支持:虽然C 语言所具有的函数回调对此非常适用,而 C+ 却始终缺少这种针对对象方法的回调。函数指针只能使用全局函数或静态函数。例:typedef void (*EventFunc)(int x,int y ); EventFunc onBnEvent = ; onBnEvent 0=myOnBn; myOnBn(int x,int y). onBnEvent 0(3 , 140 ); onBnEvent 1(3, 50 );处理事件(全局函数)订阅事件上海

4、大学机电工程与自动化学院 雷电 VC+7.0提供下面的关键字支持面向对象的事件编程event_source 、event_receiver _event 、 _hook 、_unhook VC+8.0 提供下面的关键字支持托管代码的事件编程delegate 、event .NET对不同类型的对象预定义了大量事件订阅事件+= 取消订阅 -= VC+9.0 STL 增加了 function 类模板,bind函数,以以支持本地的面向对象的事件编程上海大学机电工程与自动化学院 雷电using namespace System;delegate void Del(int, float); ref cla

5、ss EventSource public: event Del E; void fire(int i, float f) E(i, f); ; ref class EventReceiver public: void Handler(int i , float f) Console:WriteLine(Receive:0,1,i,f); ; int main () EventSource es = gcnew EventSource(); EventReceiver er = gcnew EventReceiver(); es-E += gcnew Del(er, &EventRec

6、eiver:Handler); es - fire(1, 3.14); 输出结果: Receive : 1 , 3.14事件对象事件响应成员函数创建对象Hook事件激发事件上海大学机电工程与自动化学院 雷电#include #include #include using namespace std; using namespace std:tr1; using namespace std:tr1:placeholders;class CMyControlpublic:typedef function EventHandle;vector m_onBnEvent;void hook( Event

7、Handle onEventHandle ) m_onBnEvent.push_back(onEventHandle);void notifyAll() int x = 100;int y = 200; for (vector:iterator it = m_onBnEvent.begin();it != m_onBnEvent.end(); +it) EventHandle &onEventHandle = *it;onEventHandle(x,y); ;订阅事件成员函数事件对象通知客户代码处理事件 成员函数激发事件,回调客户代码处理事件上海大学机电工程与自动化学院 雷电class

8、 CMyViewpublic:CMyControl m_ctrl;CMyView()m_ctrl.hook(bind ( &CMyView:onEventHandle,this, _1 , _2 ) );void onEventHandle(int x,int y )coutx yendl;int _tmain(int argc, _TCHAR* argv)CMyView m;m.m_ctrl.notifyAll();return 0;订阅事件绑定参数到可调用成员函数输出: 100 200上海大学机电工程与自动化学院 雷电function test()Text2.value += Te

9、xt1.value;上海大学机电工程与自动化学院 雷电 你的类从基类中派生而来,且基类中中已有事件处理函数,针对不同的处理,可通过覆盖覆盖这些事件方法来设计你所希望的对应事件处理。class CMyView : public CView .public:virtual void OnDraw( CDC *pDC ) ;上海大学机电工程与自动化学院 雷电Windows 消息处理消息泵WndProc地址PostMessage()SendMessage()消息n+1消息n+2消息n+3窗口对象非非M F C窗口用简单的c a s e语句来编程WndPro(每个c a s e语句执行一些函数,或调用其

10、他一些函数。MainWndProc( HWND hWnd, UINT message, W PARAM wParam,L PARAM lParam)s w i t c h ( m e s s a g e )case WM_CREAT E : : :c a s e语句不能很好地语句不能很好地适应适应C + +和封装技术。和封装技术。上海大学机电工程与自动化学院 雷电MFC 消息映射表消息映射表为什么要消息映像?为什么不为每个窗口消息调用一个预定义的虚拟函数?因为它太占C P U。上海大学机电工程与自动化学院 雷电VC+中有一个中有一个ClassWizard(类向导)(类向导),它会帮助用户建立消

11、,它会帮助用户建立消息映射和消息处理函数的框架,消息和函数都由息映射和消息处理函数的框架,消息和函数都由MFC缺省的命缺省的命名方式命名。名方式命名。根据消息处理函数的不同,消息分三类():根据消息处理函数的不同,消息分三类():窗口消息:窗口消息:由由MFC的窗口类(的窗口类(CWnd)对象来处理,即这类消息处理函数)对象来处理,即这类消息处理函数一般是一般是CWnd类的成员函数。有缺省窗口处理函数类的成员函数。有缺省窗口处理函数控制通知消息:控制通知消息:来自子窗口的通知消息。参数中包含子窗口标识和通知码。来自子窗口的通知消息。参数中包含子窗口标识和通知码。通知码是子窗口定义的一些常量。有

12、缺省处理,但一般要重载。通知码是子窗口定义的一些常量。有缺省处理,但一般要重载。 * 若若CWnd派生类没有重载上述两类消息处理函数,则消息映射机制派生类没有重载上述两类消息处理函数,则消息映射机制会转由其基类处理(最终是会转由其基类处理(最终是CWnd类);若类);若CWnd类也没有定义对应类也没有定义对应的消息处理函数,则调用的消息处理函数,则调用Windows缺省的窗口函数处理。缺省的窗口函数处理。命令消息:命令消息:来自菜单、工具栏,加速键的通知消息,参数中包括命令标识来自菜单、工具栏,加速键的通知消息,参数中包括命令标识(ID)号,它是应用程序自定义的一些常量,由程序员编写消息处理)

13、号,它是应用程序自定义的一些常量,由程序员编写消息处理函数。函数。MFC也定义了一些缺省的标准命令消息处理函数,也定义了一些缺省的标准命令消息处理函数,上海大学机电工程与自动化学院 雷电程序类型程序类型搜索路径搜索路径SDI单文单文档档当前视图当前视图当前文档当前文档文档模板文档模板主框架窗口主框架窗口应用程应用程序对象序对象MDI多文多文档档当前视图当前视图当前文档当前文档创建文档的文档模板创建文档的文档模板活动的子活动的子框架窗口框架窗口主框架窗口主框架窗口应用程序对象应用程序对象对话框对话框当前对话框当前对话框对话框的父窗口对话框的父窗口应用程序对象应用程序对象MFC对命令消息搜索相应消

14、息处理函数的过程是:由菜单、工具栏等用户界对命令消息搜索相应消息处理函数的过程是:由菜单、工具栏等用户界面对象产生的命令消息,首先送给主框架窗口的标准面对象产生的命令消息,首先送给主框架窗口的标准MFC窗口函数,然后窗窗口函数,然后窗口函数把命令传给口函数把命令传给MFC主框架窗口对象,进行命令消息的派送,并按下表的主框架窗口对象,进行命令消息的派送,并按下表的次序进行消息匹配。若找不到,则先继续搜索其基类的消息映射入口表,若次序进行消息匹配。若找不到,则先继续搜索其基类的消息映射入口表,若都找不到,再迂回到下一个对象进行处理。都找不到,再迂回到下一个对象进行处理。 都找不到,则由缺省的都找不

15、到,则由缺省的Windows消息处理函数结束该命令消息。消息处理函数结束该命令消息。 为了提高消息匹配的效率,为了提高消息匹配的效率,MFC内部有一个内部有一个消息缓冲池消息缓冲池,使用,使用以消息值为关键字的散列(哈希)查找,这里可存放以消息值为关键字的散列(哈希)查找,这里可存放512条最近使用条最近使用过的消息映射入口表项的有关信息(只需放入口表项,即两个指过的消息映射入口表项的有关信息(只需放入口表项,即两个指针)。仅在消息缓冲池中匹配不到才进行前文所叙的搜索过程。针)。仅在消息缓冲池中匹配不到才进行前文所叙的搜索过程。上海大学机电工程与自动化学院 雷电 COM 是在其上生成 Acti

16、veX 控件和 OLE 的基本“对象模型”。COM 允许对象向其他组件和宿主应用程序公开其功能。它既定义对象如何公开自身,又定义此公开如何跨越多个进程和网络进行工作。COM 还定义对象的生命周期。 上海大学机电工程与自动化学院 雷电 接口是对象向外界公开其功能的方法。在 COM 中,接口是指向由对象实现的函数的指针表(类似于 C+ vtable)。该表表示接口及其指向的函数是该接口的方法。对象可以公开它所选择的任意多个接口。 每个接口都基于基本的 COM 接口 IUnknown。IUnknown 的方法允许定位到由该对象公开的其他接口。 另外,每个接口都给定一个唯一的接口 ID (IID)。此

17、唯一性使得很容易支持接口版本控制。接口的新版本只是具有新 IID 的新接口。 注意注意 标准 COM 和 OLE 接口的 IID 是预定义的。 上海大学机电工程与自动化学院 雷电 IUnknown 是其他每个 COM 接口的基接口。IUnknown 定义三种方法:QueryInterface、AddRef 和 Release。QueryInterface 允许接口用户向对象请求指向其另一个接口的指针。AddRef 和 Release 实现该接口上的引用计数。上海大学机电工程与自动化学院 雷电 自动化(以前称为 OLE 自动化)使一个应用程序可以对另一个应用程序中实现的对象进行操作,或者公开对象

18、以便对其进行操作。 自动化服务器是一个应用程序(COM 服务器的一个类型),它通过 COM 接口向其他应用程序(称为自动化客户端)公开其功能。功能的公开使自动化客户端能够通过直接访问对象并使用对象提供的服务自动执行某些函数。接口定义 (IDL) 文件。 自动化服务器和客户端使用总是从 IDispatch 派生的 COM 接口获取并返回一组称为自动化的特定数据类型。可以使任何公开自动化接口的对象自动化,提供可从其他应用程序访问的方法和属性。 ActiveX 控件是一个自动化服务器类型;而承载 ActiveX 控件的应用程序是该控件的自动化客户端。 上海大学机电工程与自动化学院 雷电动态链接库动态链接库 (DLL) 选择以创建进程内服务器。 可执行文件可执行文件 (EXE) 选择以创建本地进程外服务器。 服务服务 (EX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论