




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows内部运行原理,Windows程序设计是完全不同于Dos环境下的程序设计,是一种事件驱动的程序设计方法。主要是基于消息的。当用户需要完成某种功能时,会调用OS的某种支持,OS将用户的需要包装成某种消息,并投递到消息队列当中。然后利用应用程序从消息队列中取走消息并进行响应。,操作系统,输入输出设备,应用程序,消息队列,操作系统能操纵输入输出设备,以执行特定的功能,操作系统能感知输入输出设备的状态变化,应用程序可以通知操作系统执行某个具体的动作,操作系统能够将输入设备的变化上传给应用程序,在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。操作系统所能完成的每一个特殊功能通常都有一个函数与其对应。也就是说,操作系统把它能完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用。这些函数的集合就是windows操作系统提供给应用程序的编程接口,即API。如CreateWindow就是一个API函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。,应用程序如何通知操作系统执行某个功能,比如用户在某个程序活动时按下一个键,操作系统马上能够感知到这一事件,并且能知道用户按下的是哪个键,操作系统并不决定对这个事件如何做出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件做出反应。好比有只蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件,并传递给我们的大脑(相当于应用程序)。我们的大脑最终决定如何对这一事件做出反应,如将蚊子赶走,或是将蚊子拍死。对事件做出反应的过程就是消息响应。,操作系统能够将输入设备的变化上传给应用程序,操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。typedefstructtagMSGHWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;DWORDtime;POINTpt;MSG;,关于消息和消息队列,窗口句柄,消息的名字,消息的附加参数,窗口是屏幕上的一个矩形区域,应用程序在该区域中显示数据并等待鼠标点击。Windows应用程序的用户界面可以包含许多窗口,当然要对这些窗口进行标识。,窗口,操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(HICON)、光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。句柄就是资源的标识,就象指针一样,我们要索引这样一个资源,就需要通过句柄去索引它。,句柄:资源的标识,intx,y;x=30,y=40;/x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重。typedefintWIDTH;typedefintHEIGHT;WIDTHx;HEIGHTy;/好处:我们从变量的类型就可以知道x和y是用来表示宽度和高度。,从变量的类型区分变量的用途,操作系统会为每个应用程序建立一个消息队列。这个队列是个先进先出的缓冲区。消息队列中的每个元素都是一条消息。操作系统将生成的消息放在消息队列里。第一条消息放入第一格,第二条消息放入第二格,依次类推。应用程序总是取走消息队列中的第一条消息。第一条消息取走后,第二条消息往前移,成为第一条,剩余的消息依次前移。应用程序取得消息后,便能知道用户的操作以及应用程序的状态的变化。当收到消息的时候,会编写针对这个消息的处理代码,这个过程就叫消息响应。消息响应是通过程序实现的,这就是Windows应用程序的主要代码区。,消息队列,消息队列,PostMessage,SendMessage,在消息响应过程中,我们可能要调用操作系统提供的其他API函数以便完成特定的功能。例如收到窗口关闭的消息,我们就可以调用一个销毁窗口的API函数DestroyWindows去关闭该窗口,或者弹出一个消息框提示用户是否真的要关闭该窗口。,消息队列,Windows程序的入口函数intAPIENTRY_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow);,WinMain函数,实例句柄:当运行一个程序的时候,这个运行的程序就叫实例。,先前应用程序实例句柄,命令行参数,显示的状态,(1)设计一个窗口类(2)注册窗口类(3)创建窗口(4)显示及更新窗口,窗口的创建,设计窗口类,窗口类的类型,TypedefstructtagWNDCLASSEXWUINTcbSize;UINTstyle;WNDPROClpfnWndProc;intcbClsExtra;intcbWndExtra;HINSTANCEhInstance;HICONhIcon;HCURSORhCursor;HBRUSHhbrBackground;LPCWSTRlpszMenuName;LPCWSTRlpszClassName;HICONhIconSm;WNDCLASSEXW,#ifdefUNICODEtypedefWNDCLASSEXWWNDCLASSEX;,在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一特性。当该变量的某位为1时,表示有该位对应的哪种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位为1,其余的位都为0。CS_VREDRAW=0X0001,CS_HREDRAW=0X0002,CS_DBLCKS=0X0008,CS_NOCLOSE=0X0200。它们的共同点就是只有一位为1,其余位都为0.,窗口类的类型,如果希望某一变量的数值既有CS_VREDRAW特性,又有CS_HREDRAW特性,只需使用二进制OR操作符将它们进行或运算相组合。如style=CS_VREDRAW|CS_HREDRAW|CS_NOCLOSE。如果希望在某一变量原有的几个特征上去掉其中一个特征,用取反之后再进行与运算就能够实现。如stylUINTstyle;WNDPROClpfnWndProc;intcbClsExtra;intcbWndExtra;HINSTANCEhInstance;HICONhIcon;HCURSORhCursor;HBRUSHhbrBackground;LPCWSTRlpszMenuName;LPCWSTRlpszClassName;HICONhIconSm;WNDCLASSEXW,回调函数的原理:当应用程序收到给某一窗口的消息时(消息通常与窗口相关),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数是通过lpfnWndProc成员指定的。,窗口过程函数,汽车厂家生产汽车好比应用程序创建窗口,用户使用汽车好比操作系统管理窗口,某种汽车在销售前就指定好了修理站(类似回调函数),当用户的汽车出现故障后(类似窗口接受到消息),汽车用户(类似操作系统)自己直接找到修理站去修理,不用厂家(类似应用程序)亲自将车送到修理站去修理,但修理站还得由厂家事先建造好。,窗口过程函数,typedefstructtagWNDCLASSEXWUINTcbSize;UINTstyle;WNDPROClpfnWndProc;intcbClsExtra;intcbWndExtra;HINSTANCEhInstance;HICONhIcon;HCURSORhCursor;HBRUSHhbrBackground;LPCWSTRlpszMenuName;LPCWSTRlpszClassName;HICONhIconSm;WNDCLASSEXW,设计窗口类,类的额外参数,窗口的实例句柄,光标的句柄,画刷的句柄,菜单的名字,类的名字,图标的句柄,小图标的句柄,创建窗口,HWNDCreateWindow(LPCTSTRlpClassName,/已注册的窗口类的名字LPCTSTRlpWindowName,/窗口的名字,即标题栏上显示的文字DWORDdwStyle,/窗口的类型intx,/窗口显示时左上角的x坐标inty,/窗口显示时左上角的y坐标intnWidth,/窗口宽度intnHeight,/窗口高度HWNDhWndParent,/父窗口的句柄HMENUhMenu,/菜单的句柄HINSTANCEhInstance,/实例的句柄LPVOIDlpParam/与窗口相关的附加参数);,消息循环,hAccelTable=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_WINMAIN2);装载指定的加速键表。(加速键就是比如你按Ctrl+N会新建文档,Ctrl+S会保存文档,这些组合键就是加速键。使用加速键首先要建立加速键的资源,然后在程序初始化的时候LoadAccelerators,然后在WinMain主消息循环中调用TranslateAccelerator),GetMessage是从消息队列中取消息,操作系统会为每个应用程序建立一个消息队列。BOOLGetMessage(LPMSGlpMsg,/消息HWNDhWnd,/窗口句柄,表明从哪个窗口的消息队列中取消息。UINTwMsgFilterMin,/消息的最小值UINTwMsgFilterMax/消息的最大值);,消息循环,通过指定消息的范围来过滤消息。如果都为0,则没有消息的过滤,消息循环,TranslateAccelerator(msg.hwnd,hAccelTable,/翻译消息就是对取到的消息对进行转换。当我们按下键盘上的某一个按键时,系统会产生WM_KEYDOWN和WM_KEYUP两个消息,并且参数中提供这个键的虚拟扫描码。但用户按下某个键,可能需要知道具体按下的是哪个字符,在消息的附加参数中提供该键的ASCII码。TranslateMessage会将WM_KEYDOWN和WM_KEYUP两个消息转换成WM_CHAR消息,并且将转换好的消息投递到消息队列中。这个转换过程不会影响原来的消息,只会产生一个新消息。如果我们不用这个函数,则收不到WM_CHAR消息。,消息循环,DispatchMessage函数的作用是将收到的消息传给窗口的回调函数,即窗口过程函数去处理。可以这样理解,该函数将消息路由给了操作系统,操作系统通过调用窗口过程函数去处理消息。这个窗口过程函数就是在设计窗口类时指定的。每当从消息队列中取到一条消息时,都会调用窗口过程函数。因此在该函数中我们要判读是哪个消息。用的是SWITCH语句。,消息循环,设计窗口类,窗口过程函数,typedefstructtagWNDCLASSEXWUINTcbSize;UINTstyle;WNDPROClpfnWndProc;intcbClsExtra;intcbWndExtra;HINSTANCEhInstance;HICONhIcon;HCURSORhCursor;HBRUSHhbrBackground;LPCWSTRlpszMenuName;LPCWSTRlpszClassName;HICONhIconSm;WNDCLASSEXW,是调用的约定。vc+中有2种调用约定。一种是标准的调用约定,一种是C语言的调用约定。标准的调用约定就是PASCAL的调用。主要是参数传递的顺序以及堆栈的清除有些差异。除了可变参数的函数外,其余的函数都是STDCALL的调用习惯,但是c+的编译环境,缺省下是cdecl的调用约定。所以在vc+中要调用stdcall这样调用约定的API函数的话,就要在函数原型前说明stdcall,回调函数也应该是。,CALLBACK,操作系统会在多个不同的时机发送WM_PAINT消息:(1)当第一次创建一个窗口时(2)当改变窗口的大小时(3)当把窗口从另一个窗口背后移出时(4)当最大化或最小化窗口时等等这些动作都是由系统管理的,应用只是被动地接收该消息,在消息响应中进行绘制操作;,WM_PAINT消息,Windows程序的生与死(1)程序初始化过程中调用CreateWindow,为程序建立一个窗口。CreateWindow产生窗口之后会发送WM_CREATE消息给窗口函数。(2)在程序运行的过程中,不断用GetMessage函数从消息队列中抓取消息。如果该消息是WM_QUIT,GetMessage会传回0而结束while循环,进而结束整个程序。(3)DispatchMessag把消息派送到窗口函数。消息将在窗口函数中被判读并处理。(4)程序不断进行(2)和(3)的操作。,Windows程序的生与死(5)当按下系统菜单中的Close命令时,系统发送WM_CLOSE消息。一般程序的窗口函数不需要处理该消息,于是DefWindowProc处理它。(6)DefWindowProc收到WM_CLOSE后,调用DestroyWindow把窗口清除。DestroyWindow本身又会发送WM_DESTROY消息。(7)程序对WM_DESTROY消息的反应是调用PostQuitMessage。(8)PostQuitMessage没什么其它操作,只是送出WM_QUIT消息,准备让消息循环中的GetMessage取得,如(2)所示,结束消息循环。,WNDCLASSEXwcex;wcex.cbSize=sizeof(WNDCLASSEX);wcex.style=CS_HREDRAW|CS_VREDRAW;wcex.lpfnWndProc=(WNDPROC)WndProc;wcex.cbClsExtra=0;wcex.cbWndExtra=0;wcex.hInstance=hInstance;wcex.hIcon=Loa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年巨野县数学三年级第一学期期末综合测试模拟试题含解析
- 2025-2026学年江苏省南通市崇川区通师二附教育集团三年级数学第一学期期末教学质量检测模拟试题含解析
- 2025-2026学年福建省宁德市霞浦县三年级数学第一学期期末调研模拟试题含解析
- 2025-2026学年北京市通州区漷县镇中心小学三年级数学第一学期期末学业水平测试试题含解析
- 2025-2026学年安徽省阜阳市颍泉区数学三年级第一学期期末达标检测试题含解析
- 2025年行政管理语文能力应用试题及答案
- 少数民族文化的多元价值及其融合试题及答案
- 2025年主管护师精准复习试题及答案
- 行政管理未来发展试题及答案
- 行政管理中的法律风险分析试题及答案
- 2025届广西邕衡教育名校联盟高三下学期新高考5月全真模拟联合测试数学试题及答案
- 中华人民共和国农村集体经济组织法
- 中华传统文化之文学瑰宝学习通超星期末考试答案章节答案2024年
- 02-新版3合1及50430内审检查表
- 全国普通高等学校本专科毕业生就业协议书(填写模板)
- ERP生产管理系统用户手册(共51页)
- 封条模板(A3纸)
- 无机化学 第18章 氢和稀有气体
- 湖南省农村土地承包经营权确权登记技术方案
- 供水公司组织机构配置
- JJG 852-2019中子周围剂量当量(率)仪 检定规程(高清版)
评论
0/150
提交评论