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

下载本文档

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

文档简介

消息驱动机制Windows程序和传统程序的根本区别: 传统程序是通过调用系统函数来获得用户输入,而Windows程序是通过操作系统发送的消息来处理用户输入。不了解事件编程就无法深入Windows程序和Web设计的殿堂。面向对象的编程,要执行一个任务有两种启动方式:客户/服务器模式。委托/事件模式。上海大学机电工程与自动化学院雷电事件概念事件字面意义:事件可以是你认为的任何可能发生的事情。事件:是事件源中的方法,该方法在被调用时生成事件,本质上是一种特殊的函数指针,通过调用事件方法“激发”该事件。事件源(事件发生器):是定义事件和包含事件的对象。事件接收器:是接收事件的对象。事件处理程序:是事件接收器中接收事件的方法。挂钩事件(定阅事件):是指将事件与事件处理程序相关联。解除挂钩事件(撤销定阅事件):是指使事件与事件处理程序分离。上海大学机电工程与自动化学院雷电鼠标事件处理程序:OnClick客户定阅鼠标事件回调(通知)客户事件处理程序:OnSubmit定阅鼠标事件回调(通知)事件发生器事件ButtonClick最重要的意义是:事件源模块不用关心谁来响应事件,使系统间的模块间的关系是一种松散的关系。上海大学机电工程与自动化学院雷电事件的处理主要有两种方法委托式的事件处理模式(函数回调,函数指针的集合)类的层次体系的虚函数覆盖。(多态性)上海大学机电工程与自动化学院雷电事件机制的实现VC++6.0没有提供支持:虽然C语言所具有的函数回调对此非常适用,而C++却始终缺少这种针对对象方法的回调。函数指针只能使用全局函数或静态函数。例:

typedefvoid(*EventFunc)(intx,inty); EventFunconBnEvent[]=; onBnEvent[0]=myOnBn; myOnBn(intx,inty){….}

onBnEvent[0](3,140); onBnEvent[1](3,50);声明委托(声明事件签名)定义事件对象事件源引发事件处理事件(全局函数)订阅事件上海大学机电工程与自动化学院雷电VC++7.0提供下面的关键字支持面向对象的事件编程

event_source、event_receiver __event、 __hook、__unhookVC++8.0提供下面的关键字支持托管代码的事件编程

delegate、event .NET对不同类型的对象预定义了大量事件 订阅事件+=取消订阅-=VC++9.0STL增加了function类模板,bind函数,以支持本地的面向对象的事件编程上海大学机电工程与自动化学院雷电例:.NET事件机制编程usingnamespaceSystem;delegate

voidDel(int,float);refclassEventSource{public:

eventDel^E;

voidfire(inti,floatf){E(i,f);}};refclassEventReceiver{public:

voidHandler(inti,floatf){Console::WriteLine("Receive:{0},{1}",i,f);}};

intmain(){EventSource^es=gcnewEventSource(); EventReceiver^er=gcnewEventReceiver(); es->E+=gcnewDel(er,&EventReceiver::Handler); es->fire(1,3.14);}输出结果:Receive:1,3.14事件对象声明委托(声明事件签名)事件响应成员函数创建对象Hook事件激发事件上海大学机电工程与自动化学院雷电标准C++库的扩展(新)#include<iostream>#include<vector>#include<functional>usingnamespacestd;usingnamespacestd::tr1;usingnamespacestd::tr1::placeholders;classCMyControl{public: typedeffunction<void(int,int)>EventHandle; vector<EventHandle>m_onBnEvent;

voidhook(EventHandleonEventHandle) { m_onBnEvent.push_back(onEventHandle); }

voidnotifyAll() { intx=100; inty=200;for(vector<EventHandle>::iteratorit=m_onBnEvent.begin(); it!=m_onBnEvent.end();++it) { EventHandle&onEventHandle=*it;

onEventHandle(x,y);

} }};订阅事件成员函数事件对象通知客户代码处理事件成员函数激发事件,回调客户代码处理事件上海大学机电工程与自动化学院雷电classCMyView{

public: CMyControlm_ctrl; CMyView() { m_ctrl.hook(bind(&CMyView::onEventHandle,this,_1,_2)); } voidonEventHandle(intx,inty) { cout<<x<<""<<y<<endl; }};int_tmain(intargc,_TCHAR*argv[]){ CMyViewm; m.m_ctrl.notifyAll(); return0;}订阅事件绑定参数到可调用成员函数输出:100200上海大学机电工程与自动化学院雷电例HTML事件<html><body><script> functiontest() { Text2.value+=Text1.value; }</script><inputid="Text1"type="text"value="a"><inputid="Text2"type="text"><p></p><inputid="Button1"type=buttonvalue="clickme"onclick="test()"></body></html>上海大学机电工程与自动化学院雷电覆盖事件方法你的类从基类中派生而来,且基类中中已有事件处理函数,针对不同的处理,可通过覆盖这些事件方法来设计你所希望的对应事件处理。

classCMyView:publicCView {…. public: virtualvoidOnDraw(CDC*pDC) {……} };上海大学机电工程与自动化学院雷电Windows消息处理消息泵WndProc地址PostMessage()SendMessage()消息n+1消息n+2消息n+3窗口对象非MFC窗口用简单的case语句来编程WndPro(每个case语句执行一些函数,或调用其他一些函数。MainWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){ switch(message) { caseWM_CREATE: :::case语句不能很好地适应C++和封装技术。上海大学机电工程与自动化学院雷电MFC消息映射表为什么要消息映像?为什么不为每个窗口消息调用一个预定义的虚拟函数?因为它太占CPU。上海大学机电工程与自动化学院雷电MFC的消息映射与命令传递VC++中有一个ClassWizard(类向导),它会帮助用户建立消息映射和消息处理函数的框架,消息和函数都由MFC缺省的命名方式命名。根据消息处理函数的不同,消息分三类():窗口消息:由MFC的窗口类(CWnd)对象来处理,即这类消息处理函数一般是CWnd类的成员函数。有缺省窗口处理函数控制通知消息:来自子窗口的通知消息。参数中包含子窗口标识和通知码。通知码是子窗口定义的一些常量。有缺省处理,但一般要重载。*若CWnd派生类没有重载上述两类消息处理函数,则消息映射机制会转由其基类处理(最终是CWnd类);若CWnd类也没有定义对应的消息处理函数,则调用Windows缺省的窗口函数处理。命令消息:来自菜单、工具栏,加速键的通知消息,参数中包括命令标识(ID)号,它是应用程序自定义的一些常量,由程序员编写消息处理函数。MFC也定义了一些缺省的标准命令消息处理函数,上海大学机电工程与自动化学院雷电8.8MFC的消息映射与命令传递程序类型搜索路径SDI单文档当前视图→当前文档→文档模板→主框架窗口→应用程序对象MDI多文档当前视图→当前文档→创建文档的文档模板→活动的子框架窗口→主框架窗口→应用程序对象对话框当前对话框→对话框的父窗口→应用程序对象MFC对命令消息搜索相应消息处理函数的过程是:由菜单、工具栏等用户界面对象产生的命令消息,首先送给主框架窗口的标准MFC窗口函数,然后窗口函数把命令传给MFC主框架窗口对象,进行命令消息的派送,并按下表的次序进行消息匹配。若找不到,则先继续搜索其基类的消息映射入口表,若都找不到,再迂回到下一个对象进行处理。都找不到,则由缺省的Windows消息处理函数结束该命令消息。为了提高消息匹配的效率,MFC内部有一个消息缓冲池,使用以消息值为关键字的散列(哈希)查找,这里可存放512条最近使用过的消息映射入口表项的有关信息(只需放入口表项,即两个指针)。仅在消息缓冲池中匹配不到才进行前文所叙的搜索过程。上海大学机电工程与自动化学院雷电组件对象模型--COMCOM是在其上生成ActiveX控件和OLE的基本“对象模型”。COM允许对象向其他组件和宿主应用程序公开其功能。它既定义对象如何公开自身,又定义此公开如何跨越多个进程和网络进行工作。COM还定义对象的生命周期。上海大学机电工程与自动化学院雷电COM接口接口是对象向外界公开其功能的方法。在COM中,接口是指向由对象实现的函数的指针表(类似于C++vtable)。该表表示接口及其指向的函数是该接口的方法。对象可以公开它所选择的任意多个接口。每个接口都基于基本的COM接口IUnknown。IUnknown

的方法允许定位到由该对象公开的其他接口。另外,每个接口都给定一个唯一的接口ID(IID)。此唯一性使得很容易支持接口版本控制。接口的新版本只是具有新IID的新接口。注意

标准COM和OLE接口的IID是预定义的。上海大学机电工程与自动化学院雷电IUnknownIUnknown是其他每个COM接口的基接口。IUnknown

定义三种方法:QueryInterface、AddRef和Release。QueryInterface允许接口用户向对象请求指向其另一个接口的指针。AddRef和Release实现该接口上的引用计数。上海大学机电工程与自动化学院雷电自动化自动化(以前称为OLE自动化)使一个应用程序可以对另一个应用程序中实现的对象进行操作,或者公开对象以便对其进行操作。自动化服务器是一个应用程序(COM服务器的一个类型),它通过COM接口向其他应用程序(称为自动化客户端)公开其功能。功能的公开使自动化客户端能够通过直接访问对象并使用对象提供的服务自动执行某些函数。接口定义(IDL)文件。自动化服务器和客户端使用总是从IDispatch

派生的COM接口获取并返回一组称为自动化的特定数据类型。可以使任何公开自动化接口的对象自动化,提供可从其他应用程序访问的方法和属性。ActiveX控件是一个自动化服务器类型;而承载ActiveX控件的应用程序是该控件的自动化客户端。上海大学机电工程与自动化学院雷电COM服务器类型动态链接库(DLL)

选择以创建进程内服务器。可执行文件(EXE)

选择以创建本地进程外服务器。服务(EXE)

选择以创建当Windows启动时在后台运行的Windows应用程序。上海大学机电工程与自动化学院雷电.NET.NETFramework是支持生成和运行下一代应用程序和XMLWebServices的内部Windows组件。.主要组件:公共语言运行库(CLR)

以CLR为目标的代码称为托管代码2.面向对象的.NETFramework类库.上海大学机电工程与自动化学院雷电元数据当今应用程序模型发生了重大变化,应用程序不但包含数据、代码还包含对自身进行描述的元数据,组件间无缝交互。自描述JavaC#C++.NET上海大学机电工程与自动化学院雷电网络通讯VC++应用程序中Windows套接字的应用一.socket基本概念客户端应用逻辑服务器端应用逻辑编程难点socket类型二.MFC使用面向对象的方法使用类CAsyncSocket

和CSocket封装了WindowsSocketsAPI.上海大学机电工程与自动化学院雷电CAsyncSocketBOOLCreate(UINTnSocketPort=0);//创建socketBOO

温馨提示

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

评论

0/150

提交评论