软件开发技术与环境论文.docx

上传人:b****4 文档编号:5412050 上传时间:2023-05-08 格式:DOCX 页数:11 大小:183.90KB
下载 相关 举报
软件开发技术与环境论文.docx_第1页
第1页 / 共11页
软件开发技术与环境论文.docx_第2页
第2页 / 共11页
软件开发技术与环境论文.docx_第3页
第3页 / 共11页
软件开发技术与环境论文.docx_第4页
第4页 / 共11页
软件开发技术与环境论文.docx_第5页
第5页 / 共11页
软件开发技术与环境论文.docx_第6页
第6页 / 共11页
软件开发技术与环境论文.docx_第7页
第7页 / 共11页
软件开发技术与环境论文.docx_第8页
第8页 / 共11页
软件开发技术与环境论文.docx_第9页
第9页 / 共11页
软件开发技术与环境论文.docx_第10页
第10页 / 共11页
软件开发技术与环境论文.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

软件开发技术与环境论文.docx

《软件开发技术与环境论文.docx》由会员分享,可在线阅读,更多相关《软件开发技术与环境论文.docx(11页珍藏版)》请在冰点文库上搜索。

软件开发技术与环境论文.docx

软件开发技术与环境论文

 

软件开发技术与环境论文

题目:

简述Windows消息机制

学院:

专业:

姓名:

指导教师:

学号:

2016年6月

简述Windows消息机制

摘要

通过分析消息的结构和Windows消息队列,介绍了Windows消息机制的基本原理。

通过分析窗口过程的伪代码,研究了Windows消息机制的实现过程。

Windows消息循环是Windows应用程序开发的基础,同时也是应用编程的重点和难点,要掌握Windows应用程序开发,深入的理解Windows消息循环机制是必不可少的。

本文将首先阐述Windows的编程原理,继而对Windows的消息运行机制进行分析,并讲述对消息的处理。

MFC是一个广为使用的编程类库,对Windows的消息机制进行了良好的封装,所以,在第二部分将着重讨论MFC的消息映射,最后结合编程实际,通过对MFC消息映射的分析,非常巧妙的加以应用,以帮助解决实际问题。

关键词:

消息结构;消息循环;MFC

TheIntroductionofWindowsMessageMechanism

Abstract

ByanalyzingthestructureofthemessageandtheWindowsmessagequeue,thispaperintroducesthebasicprinciplesoftheWindowsmessagemechanism.Byanalyzingthepseudo-codeofthewindowproceduretostydythemechanismoftheimplementationprocessWindowsmessages.WindowsmessageloopisaWindowsbasedapplicationdevelopment,butalsothefocusanddifficultyofapplicationprogramming.TomasterWindowsapplicationdevelopment,in-depthunderstandingoftheWindowsmessageloopmechanismisessential.ThepaperalsopresentsabasicframeworkforWindowsapplications,theWindowsprogrammessagelooptoexplainthespecificimplementationmechanismstohelpusbetterunderstandtheWindowsmessageloopmechanism,trulygrasptheWindowsapplicationdevelopment.

Keywords:

MessageStructure;MessageLoop;MFC

目录

1引言1

2Windows消息运行机制1

2.1消息的概念和表示1

2.2Windows编程原理2

2.3Windows消息循环3

3Windows应用程序框架3

4MFC的消息映射5

4.1MFC消息映射的实现5

4.2MFC消息分类5

总结8

参考文献8

Windows消息机制的研究

1引言

Windows在操作系统平台占有绝对统治地位,基于Windows的编程和开发越来越广泛。

Dos是过程驱动的,而Windows是事件驱动的[6],这种差别的存在使得很多Dos程序员不能习惯Windows的程序开发。

而很多Windows程序开发人员也只是对消息运行机制一知半解,想要掌握Windows编程的核心,必须深刻理解消息机制。

事件驱动围绕着消息的产生与处理展开,事件驱动是靠消息循环机制来实现的。

也可以理解为消息是一种报告有关事件发生的通知,消息是Windows操作系统的灵魂,掌握了消息运行机制就掌握了Windows编程的神兵利器。

用户通过应用程序界面上的菜单栏、工具栏进行各种操作,这些操作触发各种事件,事件以消息的形式交给应用程序来处理,应用程序通过对这些消息的响应来实现用户的需求。

Windows应用程序的这些特点很适合于用户的操作习惯,软件的使用变得简单灵活,同时,为了方便Windows平台下的应用程序开发,微软对操作系统的功能进行了封装,提供了一套完整的接口函数共然间开发人员使用,这就是Windows应用程序接口(WindowsAPI)。

通过调用WindowsAPI函数,软件开发人员就可以利用操作系统的功能,快速地开发出运行在Windows平台上的应用程序。

由此可见,消息机制在windows应用编程的重要性。

2Windows消息运行机制

2.1消息的概念和表示

消息(Message)指的就是Windows操作系统发给应用程序的一个通告,它告诉应用程序某个特定的事件发生了。

比如,用户单击鼠标或按键都会引发Windows系统发送相应的消息。

最终处理消息的是应用程序的窗口函数,如果程序不负责处理的话系统将会作出默认处理。

消息通常分为以下四种:

(1)标准消息:

除了WM_COMMAND,所有的以WM开头的消息都是标准消息。

如窗口、鼠标移动、窗口大小改变等。

程序启动或退出甚至每一段固定的时间都会产生标准Windows消息。

(2)命令消息:

来自于菜单、加速键、工具栏按钮的消息,这类消息都以WM_COMMAND形式呈现。

(3)通知消息:

由控件产生的消息。

按键和鼠标的单击列表框都会产生这类消息,这类消息的目的是为了向父窗口(通常是对话框)通知事件的发生,它也是以WM_COMMAND形式呈现的。

(4)用户自定义的消息。

尽管Windows系统有众多消息,但还是不能满足复杂多变的要求,当某些特定的事情发生时,为了能及时通知应用程序,便引入了自定义消息。

从数据结构的角度来说,消息是一个结构体,它包含了消息的类型标识符以及其他的一些附加信息。

系统定义的结构体MSG[1]用于表示消息,MSG具有如下定义形式:

typedefstructtagMSG

{

HWNDhwnd;

UINTmessage;

WPARAMwParam;

LPARAMlParam;

DWORDtime;

POINTpt;

}MSG;

其数据成员的具体意义如下:

1.hwnd:

消息将要发送到那个窗口的句柄,用这个参数可以决定让哪个窗口接收消息;2.message:

消息号,它唯一标识了一种消息类型,每种消息类型都在Windows文件进行了预定义;3.wParam:

一个32位的消息参数,这个值的确切意义取决于消息本身;4.lParam:

一个32位的消息参数,这个值的确切意义取决于消息本身;5.time:

消息放入消息队列中的时间,在这个域中写入的并非当时日期,而是从Windows启动后所测量的时间值,Windows用这个域来使消息保持正确的顺序;6.pt:

消息放入消息队列时的鼠标坐标。

在MSG结构中,消息是由一个消息名称(UINT)和两个参数(WPARAM,LPARAM)组成。

当用户进行了输入或者窗口的状态发生改变时,系统都会发送消息到某一个窗口。

例如,当菜单点中之后会有WM_COMMAND消息发送。

其中,WPARAM的高字节(HIWORD(wParam))是命令的ID号,是菜单ID。

同时,用户能定义自己的消息名称,也能利用自定义消息来发送通知和传送数据。

系统通过窗口句柄在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由指定窗口接收。

窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。

句柄决定消息被发送到哪个窗口。

2.2Windows编程原理

Windows是一消息(Message)驱动式系统,Windows消息提供了应用程序与应用程序之间、应用程序与Windows系统之间进行通讯的手段。

应用程序要实现的功能由消息来触发,并靠对消息的响应和处理来完成。

Windows系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。

计算机的所有输入设备由Windows监控,当一个事件发生时,Windows先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。

一个事件的发生,到达处理它的窗口函数必须经历上述过程。

所谓消息就是描述事件发生的信息,Windows程序是事件驱动的,用这一方法编写程序避免了死板的操作模式,因为Windows程序的执行顺序将取决于事件的发生顺序,具有不

可预知性。

Windows操作系统,计算机硬件,应用程序之间具有如图1所示的关系

箭头1说明操作系统能够操纵输入输出设备,例如让打印机打印;箭头2说明操作系统能够感知输入输出设备的状态变化,如鼠标单击,按键按下等,这就是操作系统和计算机硬件之间的交互关系,应用程序开发者并不需要知道他们之间是如何做到的,我们需要了解的操作系统与应用程序之间如何交互。

箭头3是应用程序通知操作系统执行某个具体的操作,这是通过调用操作系统的API来实现的;操作系统能够感知硬件的状态变化,但是并不决定如何处理,而是把这种变化转交给应用程序,由应用程序决定如何处理,向上的箭头4说明了这种转交情况,操作系统通过把每个事件都包装成一个称为消息结构体MSG来实现

这个过程,也就是消息响应。

2.3Windows消息循环

消息循环[1]是Windows应用程序存在的根本,应用程序通过消息循环获取各种消息,并通过相应的窗口过程函数,对消息加以处理;正是这个消息循环使得一个应用程序能够响应外部的各种事件,所以消息循环往往是一个Windows应用程序的核心部分。

Windows的消息机制如图2所示:

3Windows应用程序框架

Windows应用程序框架如图1所示,图中操作系统负责管理计算机的软硬件资源,如输入输出设备。

应用程序加载到内存中运行后,操作系统会为其维护一个消息队列。

(1)应用程序启动运行,被加载到内存中,操作系统为其维护一个消息队列。

(2)用户通过应用程序界面进行各种操作,触发相应的事件。

(3)操作系统捕获事件,将其封装成消息,并放到与该应用程序相关的队列中。

(4)应用程序从消息队列获取消息,然后转换消息,派遣消息。

(5)应用程序将消息派遣给操作系统,操作系统调用应用程序注册的回调函数对消息进行处理。

应用程序的运行过程如下:

用户界面

系统界面

 

 

图3-1Windows应用程序框架

在整个应用程序运行过程中需要强调一下亮点:

(1)消息循环退出的条件:

应用程序的消息处理过程是一个循环过程,应用程序不停地从消息队列获取消息,转换消息,派遣消息,然后在回调函数中处理消息。

消息循环退出的条件是应用程序从消息队列中获取了WM_QUIT消息,那么如何产生WM_QUIT消息呢?

可以调用系统函数PostQuitMessage(0)来触发WM_QUIT消息。

(2)消息处理机制:

消息的处理是在回调函数中进行的,需要注意的是回调函数是在设计窗口类时由软件开发人员指定的,回调函数在派遣消息时由操作系统来调用,而回调函数的内容是由软件开发人员实现的。

4MFC的消息映射

MFC是Windows下编程的微软基础类库,封装了大部分WindowsAPI和Windows控件,提供了一套消息映射和命令响应机制,方便了应用程序的开发。

MFC只是通过对Windows消息映射的进行封装,使得添加消息响应变得更为简单,但深究起来,与Windows消息机制有一样的底层实现。

4.1MFC消息映射的实现

在MFC的框架结构下,“消息映射”是通过巧妙的宏定义,形成一张消息映射表格来进行的。

这样一旦消息发生,Framework就可以根据消息映射表格来进行消息映射和命令传递。

首先在需要进行消息处理的类的头文件(.H)里,都会含有DECLARE_MESSAGE_MAP()宏,声明该类拥有消息映射表格。

然后在类应用程序文件(.CPP)实现这一表格

BEGIN_MESSAGE_MAP(CInheritClass,CBaseClass)

//{{AFX_MSG_MAP(CInheritClass)

ON_COMMAND(ID_EDIT_COPY,OnEditCopy)

………

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

这里主要进行消息映射的实现,把它和消息处理函数联系在一起。

其中出现三个宏,第一个宏是BEGIN_MESSAGE_MAP有两个参数,分别是拥有消息表格的类,及其父类。

第二个宏是ON_COMMAND,指定命令消息的处理函数名称。

第三个是END_MESSAGE_MAP()作为结尾符号。

DECLARE_MESSAGE_MAP宏定义里包含了MFC定义的两个新的数据结构;AFX_MSGMAP_ENTRY和AFX_MSGMAP;其中AFX_MSGMAP_ENTRY结构包含了一个消息的所有相关信息,而AFX_MSGMAP主要作用有两个,一是用来得到基类的消息映射入口地址。

二是得到本身的消息映射入口地址。

实际上,MFC把所有的消息一条条填入到AFX_MSGMAP_ENTRY结构中去,形成一个数组,该数组存放了所有的消息和与它们相关的参数。

同时通过AFX_MSGMAP能得到该数组的首地址,同时得到基类的消息映射入口地址。

当本身对该消息不响应的时候,就可以上溯到基类的消息映射表寻找对应的消息响应。

MFC通过钩子函数_AfxCbtFilterHook()截获消息,并在此函数中把窗口过程函数设置为AfxWindProc,而原来的窗口过程函数被保存在成员变量m_pfnSuper中。

在MFC框架下,通过下面的步骤来对消息进行映射。

1函数AfxWndProc接收Windows操作系统发送的消息。

2函数AfxWndProc调用函数AfxCallWndProc进行消息处理,这里一个进步是把对句柄的操作转换成对CWnd对象的操作。

3函数AfxCallWndProc调用CWnd类的方法WindowProc进行消息处理。

4WindowProc调用OnWndMsg进行正式的消息处理,即把消息派送到相关的方法中去处理。

5如果OnWndMsg方法没有对消息进行处理的话,就调用DefWindowProc对消息进行处理。

4.2MFC消息分类

1命令消息(WM_COMMAND)

比如菜单项的选择,工具栏按钮点击等发出该消息。

所有派生自CCmdTarget的类都有能力接收WM_COMMAND消息。

2标准消息(WM_XXX)

比如窗口创建,窗口销毁等。

所有派生自CWnd的类才有资格接收标准消息。

3通告消息(WM_NOTIFY)

这是有控件向父窗口发送的消息,标示控件本身状态的变化。

比如下拉列表框选项的改变CBN_SELCHANGE和树形控件的TVN_SELCHANGED消息都是通告消息。

Window9x版及以后的新控件通告消息不再通过WM_COMMAND传送,而是通过

WM_NOTIFY传送,但是老控件的通告消息,比如CBN_SELCHANGE还是通过

WM_COMMAND消息发送。

4自定义消息

利用MFC编程,可以使用自定义消息。

使用自定义消息需要遵循一定的步骤[2]并需要自己编写消息响应函数。

总结

Windows消息机制是Windows编程的本质和核心,对Windows消息机制的理解能提高我们Windows程序开发的能力。

本文首先阐述Windows的消息机制,然后讲解了MFC的消息映射,消息分类,最后通过示例程序,讲解如何借助MSDN,灵活运用消息编程,解决实际问题。

本文对Windows下的程序开发具有一定的参考和借鉴意义。

参考文献

[1]周金萍,徐丙立等.Windows系统编程[M].北京:

人民邮电出版社,2002.7.

[2]CharlesPetzold.Windows程序设计[M].北京:

北京大学出版社,2000.

[3]辛长安,王颜国.VisualC++权威剖析—MFC的原理、机制与开发实例[M].北京:

清华大学出版社,2008.

[4]黄维通.VisualC++面向对象与可视化程序设计[M].北京:

清华大学出版社,2003.

[5]张曜,郭立山,戴传智.WindowsApi函数使用手册[M].北京:

冶金工业出版社,2004.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2