一windows程序设计18957PPT课件_第1页
一windows程序设计18957PPT课件_第2页
一windows程序设计18957PPT课件_第3页
一windows程序设计18957PPT课件_第4页
一windows程序设计18957PPT课件_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

.,1,Windos程序设计概观,.,2,主要内容,四大主流操作系统及其发展简史了解API的必要性窗口与消息机制HelloWin程序,.,3,一、四大主流操作系统及其发展简史,Windows(最流行、最成功)Linux(开源最成功)FreeBSD(最稳定)MACOS(图形界面最优秀),.,4,1.1Windows,Windows1.0、2.0、3.0、3.1(Janus)、3.2Windows95(Chicago)Windows98(Memphis)WindowsMe(Millennium)WindowsNT3.1(Sparta)、3.5(Daytona)、4.0(Impala)Windows2000WindowsXPWindowsServer2003WindowsVista(Longhorn)Windows7(Blackcomb),1985,1987,1990,1992,Windows1.0,Windows2.0,Windows3.0,Windows3.1,1994,Windows3.2,Windows95,1998,Windows98,2000,WindowsNT3.1,WindowsNT3.5,WindowsMe,WindowsNT4.0,Windows2000,2001,2003,WindowsXP,Windows2003,2006,WindowsVista,2009,Windows7,16位保护(3.0以上)/实模式消息机制独占式,以程序员角度比较Windows的不同版本,Windows1.03.2,Windows95Me,WindowsNTXP,16位/32位混合体保护/实模式(Me)消息机制抢占式,32位保护模式消息机制抢占式,.,7,1.2Linux,Linux是由芬兰赫尔辛基大学的一个大学生LinusB.Trolls在1991年首次编写的。标志性图标是一个可爱的小企鹅。Linux是一种类Unix系统,Linus当时编写它的目的是为了替代一种名叫Minix的操作系统。Minix是由一个名叫AndrewTannebaum的计算机教授编写的,当时由于Unix是一个商业软件,其源代码是不能拿来进行教学的,Andrew教授就自己编写了一个系统用于教学。最初的Minix用一张软盘就能装下,麻雀虽小、五脏俱全,Minix具有一般操作系统的特征,它同时兼容Unix系统。Linux是目前唯一可免费获得的、为PC及的多个用户提供多任务、多进程功能的操作系统。一个可以从网上或其他途径自由获得的免费软件。安装Linux,不仅可以亲身体验成为系统管理员的个中滋味,为爱好者们了解世界上流行的UNIX操作系统提供了廉价的机会;还可以通过在网络上开放一些服务而建立自己的网站。,Linux也分为很多种版本,现今比较流行的是:TurboLinux、RedHatLinux、SlackwareLinux,我国也有自己的Linux,其名称为红旗Linux。1994年3月,Linux1.0发布,代码量17万行,当时是按照完全自由免费的协议发布,随后正式采用GPL协议。至此,Linux的代码开发进入良性循环。很多系统管理员开始在自己的操作系统环境中尝试linux,并将修改的代码提交给核心小组。由于拥有了丰富的操作系统平台,因而Linux的代码中也充实了对不同硬件系统的支持,大大的提高了跨平台移植性。1995年,此时的Linux可在Intel、Digital以及SunSPARC处理器上运行了,用户量也超过了50万,相关介绍Linux的LinuxJournal杂志也发行了超过10万册之多。1996年6月,Linux2.0内核发布,此内核有大约40万行代码,并可以支持多个处理器。此时的Linux已经进入了实用阶段,全球大约有350万人使用。1997年夏,大片泰坦尼克号在制作特效中使用的160台Alpha图形工作站中,有105台采用了Linux操作系统。1998年是Linux迅猛发展的一年。1月,小红帽高级研发实验室成立,同年RedHat5.0获得了InfoWorld的操作系统奖项。4月Mozilla代码发布,成为linux图形界面上的王牌浏览器。Redhat宣布商业支持计划,网络了多名优秀技术人员开始商业运作。王牌搜索引擎”Google”现身,采用的也是Linux服务器。值得一提的是,Oracle和Informix两家数据库厂商明确表示不支持Linux,这个决定给予了Mysql数据库充分的发展机会。同年10月,Intel和Netscape宣布小额投资红帽软件,这被业界视作Linux获得商业认同的信号。同月,微软在法国发布了反Linux公开信,这表明微软,公司开始将Linux视作了一个对手来对待。十二月,IBM发布了适用于Linux的文件系统AFS3.5以及JikesJava编辑器和SecureMailer及DB2测试版,IBM的此番行为,可以看作是与Linux羞答答地第一次亲密接触。迫于Windows和Linux的压力,Sun逐渐开放了Java协议,并且在UltraSparc上支持Linux操作系统。1998年可说是Linux与商业接触的一年。1999年,IBM宣布与Redhat公司建立伙伴关系,以确保Redhat在IBM机器上正确运行。三月,第一届LinuxWorld大会的召开,象征Linux时代的来临。IBM、Compaq和Novell宣布投资Redhat公司,以前一直对Linux持否定态度的Oracle公司也宣布投资。五月,SGI公司宣布向Linux移植其先进的XFS文件系统。对于服务器来说,高效可靠的文件系统是不可或缺的,SGI的慷慨移植再一次帮助了Linux确立在服务器市场的专业性。7月IBM启动对Linux的支持服务和发布了LinuxDB2,从此结束了Linux得不到支持服务的历史,这可以视作Linux真正成为服务器操作系统一员的重要里程碑。2000年初始,Sun公司在Linux的压力下宣布Solaris8降低售价。事实上Linux对Sun造成的冲击远比对Windows来得更大。2月RedHat发布了嵌入式Linux的开发环境,Linux在嵌入式行业的潜力逐渐被发掘出来。在4月,拓林思公司宣布了推出中国首家Linux工程师认证考试,从此使Linux操作系统管理员的水准可以得到权威机构的资格认证,此举大大增加了国内Linux爱好者学习的热情。伴随着国际上的Linux热潮,国内的联想和联邦推出了“幸福Linux家用版”,同年7月中科院与新华,科技合作发展红旗Linux,此举让更多的国内个人用户认识到了存在着Linux这个操作系统。11月,Intel与Xteam合作,推出基于Linux的网络专用服务器,此举结束了在Linux单向顺应硬件商硬件开发驱动的历史。2001月新年依使就爆出新闻,Oracle宣布在OTN上的所有会员都可免费索取Oracle9i的Linux版本,从几年前的“绝不涉足Linux系统”到如今的主动献媚,足以体现Linux的发展迅猛。IBM则决定投入10亿美元扩大Linux系统的运用,此举犹如一针强心剂,令华尔街的投资者们闻风而动。到了5月这个初夏的时节,微软公开反对”GPL”引起了一场大规模的论战。8月红色代码爆发,引得许多站点纷纷从Windows操作系统转向Linux操作系统,虽然是一次被动的转变,不过也算是一次应用普及。12月RedHat为IBMs/390大型计算机提供了Linux解决方案,从此结束了AIX孤单独行无人伴的历史。2002年是Linux企业化的一年。2月,微软公司迫于各洲政府的压力,宣布扩大公开代码行动,这可是Linux开源带来的深刻影响的结果。3月,内核开发者宣布新的Linux系统支持64位的计算机。2003年1月,NEC宣布将在其手机中使用Linux操作系统,代表着Linux成功进军手机领域。5月之中SCO表示就Linux使用的涉嫌未授权代码等问题对IBM进行起诉,此时人们才留意到,原本由SCO垄断的银行/金融领域,份额已经被Linux抢占了不少,也难怪SCO如此气急败坏了。9月中科红旗发布RedFlagServer4版本,性能改进良多。11月IBM注资Novell以2.1亿收购SuSE,同期Redhat计划停止免费的Linux,顿时业内骂声四起。Linux在商业化的路上渐行渐远。,2004年的第1月,本着“天下事分久必合,合久必分”之天理,SuSE嫁到了Novell,SCO继续顶着骂名四处强行“化缘”,Asianux,MandrakeSoft也在五年中首次宣布季度赢利。3月SGI宣布成功实现了Linux操作系统支持256个Itanium2处理器。4月里美国斯坦福大学Linux大型机系统被黑客攻陷,再次证明了没有绝对安全的OS。六月的统计报告显示在世界500强超级计算机系统中,使用Linux操作系统的已经占到了280席,抢占了原本属于各种Unix的份额。9月HP开始网罗Linux内核代码人员,以影响新版本的内核朝对HP有利的方式发展,而IBM则准备推出OpenPower服务器,仅运行Linux系统。,1.3FreeBSD,FreeBSD是一种由Unix经过BSD、386BSD和4.4BSD发展而来的类Unix操作系统。它运行在Intelx86family兼容处理器、DECAlpha、Sun微系统的UltrasPARC、Itanium(IA-64)和AMD64处理器上。针对PowerPC的支持正在开发中。它被普遍认为是相当可靠和健壮的。苹果电脑的MacOSX即以Mach为内核,配合FreeBSD的驱动程序和实用工具为基础。1993年12月FreeBSD1.0版本于这个月正式发布。FreeBSD建成了Internet上最大、最繁忙的匿名文件服务器。BSD与ATT的源码。伯克利计算机系统研究小组去除了这些不到10%源码,发布了4.4BSDLite。直到1995年1月他们才发布了FreeBSD2.0,这次就是一个完全的4.4BSDLite的系统了。但是在大约一年时间之内,FreeBSD不能在原有1.0基础上进行改进并推出新版本,而这个时期正是Internet进一步发展的阶段,FreeBSD错过了一个发展壮大的好时机。,1.4MACOS,MacOS是一套运行于苹果Macintosh系列电脑上的操作系统。MacOS是首个在商用领域成功的图形用户界面。Macintosh组包括比尔阿特金森(BillAtkinson)、杰夫拉斯金(JefRaskin)和安迪赫茨菲尔德(AndyHertzfeld)。现行的最新的系统版本是MacOSXv10.4.2版。关于Macintosh是如何被开发和潜在创意的起源,有许多种观点。历史记录里把Macintosh和施乐公司(Xerox)帕洛阿尔托研究中心(PARC)的Alto计划联系在一起,伊凡萨瑟兰(IvanSutherland)的画板(Sketchpad)和道格英格巴特(DougEngelbart)的在线系统(On-LineSystem)对其早期贡献产生了不小的影响。MacOS可以被分成操作系统的两个系列:一个是老旧且已不被支持的“Classic”MacOS(系统搭载在1984年销售的首部Mac与其后代上,终极版本是MacOS9)。采用Mach作为内核,在OS8以前用“Systemx.xx”来称呼。新的MacOSX结合BSDUnix、OpenStep和MacOS9的元素。它的最底层建基于Unix基础,其代码被称为Darwin,实行的是部分开放源代码。,1997年1月24日,MacOS7.6发布。1997年7月22日,MacOS8发布。它是第一个真正不同于MacOS1.0桌面的系统。新一代的MacOS8比它的前辈运行更加稳定。1998年10月15日,MacOS8.5发布。1999年11月5日,MacOS9发布。它带来许多诸如Sherlock1的增强版Sherlock2的新特性。2000年1月6日,在SanFranciscoMacWorld展览会上苹果展示了其最新操作系统MacOSX,MacOSX是基于Rhapsody策略上的新操作系统。像NeXT操作系统一样他也是一个UNIX系统。苹果在MacOSX中推出了新的“Aqua”桌面。办公软件AppleWorks6发布。苹果网站上新引入了如iTools的新特性,iTools是苹果为Mac用户和iReview推出的一项免费Web空间服务。2001年3月24日,苹果如期发布了MacOSX10.0。由于苹果想在7月份MacWorld展览会上举行一个隆重的MacOSX10.1的发布会,所以这次发布显得比较平静。同期,大量的MacOSX版的第三方软件发布。2001年7月18日,在纽约MacWorld展览会上,苹果推出新G4电脑。主频高达867MHz,其中双800MHz处理器具有每秒120亿次浮点运算能力。,2001年9月25日,苹果发布了MacOSX的升级版MacOSX10.1,它比MacOSX运行更快,支持CD刻录,DVD播放和新界面(Aqua),另外还发布了MacOSXServerv10.1。2001年12月4日,MacOS9.2.2发布。2002年3月14日:MacOSX苹果远程桌面发布。苹果远程桌面是一款基于MacOS网络的管理工具软件。2002年3月21日,iPod升级版和23英寸的Cinema显示器在东京MacWorld展览会上发布,苹果宣布在4月份MacOSX将支持蓝牙。2003年10月25日,MacOSX10.3发布,系统代号为“Panther”。10.3还增强了反垃圾邮件功能,MacOSXMail(邮件)功能可以对用户邮箱地址簿之外的地址传来的所有电子邮件进行安全扫瞄。2005年4月29日,MacOSX10.4Tiger版发布,这是目前为止最新的版本。,.,16,这几种操作系统都存在图形界面,但其内部实现机制是不同的,如XWindow是以Client/Server方式实现的,Win2000等是在内核实现图形引擎的。学好WindowsAPI,理解其中的概念,也有助于对其它图形操作系统的学习。,.,17,二、了解WindowsAPI的必要性,Windows,API函数库,MFC,OWL,VB控件集,。,VisualC+,Borland产品,VisualBasic,其它,.,18,SDK(SoftwareDevelopmentKit)编程方法利用Windows系统提供的API(ApplicationProgrammingInterface)函数直接与操作系统打交道,能够提供最佳的性能、最强大的功能和最大的灵活性。无论采取什么样的方式编写代码,了解WindowsAPI都是必要的,它对于理解Windows原理非常重要。当前市面上流行的开发工具通常都提供一个功能库,例如VisualC+的MFC,BorlandC+的OWL以及VisualBasic的控件模式编程。这些功能库都是对API函数的封装,另外加上一些更为复杂的功能特性。然而,其基础是WindowsAPI函数,其功能只是API的一个子集。而且出于易用性考虑,屏蔽了API的一些具体细节,因此在某些场合不能够满足编程者的需要。而且由于其对API一些特性的屏蔽,使得编程者对于所面对的,.,19,Windows系统不能有很全面的认识,不利于向更高层次发展。当然,使用这些功能库有助于提高项目速度,掌握WindowsAPI有助于更深入以及更好的掌握这些功能库,并且能有效的扩展其功能。通常高级语言都提供了API的调用接口,只是其调用方式不太一样。例如VisualC+可以直接调用API,而VisualBasic则要通过API文本浏览器获得API函数的VisualBasic兼容定义以及对动态库的引用来使用API函数。高级语言的这个特性给了我们接触和使用底层WindowsAPI,利用API强大功能的机会。,.,20,三、窗口与消息机制,图形操作系统鼻祖Alto1973年4月,第一个可操作的Alto电脑在XeroxPARC完成。Alto是第一个把计算机所有元素结合到一起的图形界面操作系统。它使用3键鼠标、图形窗口、以太网络连接。,.,21,CP/M真正让PC能够像现在这样普及的功劳还要归功于DigisatReseach公司的工程师加里基尔达尔,他在20世纪70年代所开发的CP/M操作系统,CP/M当时是在IBM/704大型机上运行的一款8位操作系统。,.,22,2.1窗口,MicrosoftWindows应用程序中的窗口是屏幕上的一个矩形区域,是应用程序用来显示输出或接受用户输入的。由于窗口是用户和应用程序交互的基本元素,所以应用程序首要的任务就是创建一个窗口。图1-1就是一个典型的Windows窗口。,图2-1一个Windows窗口,.,23,桌面窗口:,桌面窗口是系统定义的窗口,在Windows启动后,自动创建桌面窗口。这个窗口绘制了屏幕的背景,作为Windows应用程序显示窗口的基础(可以认为是所有应用程序窗口的父窗口)。该窗口的背景图案在注册表中如下位置定义:HKEY_CURRENT_USERControlPanelDesktopWallpaper可以通过SDK函数SetDeskWallpaper指定。,.,24,应用程序窗口:,每一个标准的Windows应用程序至少要创建窗口,称为主窗口。这个窗口是用户与应用程序间的主要接口。绝大部分应用程序还会直接或间接的创建许多其它的窗口,来完成与主窗口相关的任务,每一窗口都是用来显示输出或是从用户得到输入。,应用程序窗口的组成:,应用程序窗口一般包括标题栏、菜单栏、System菜单、最小化、最大化/还原、关闭按钮、改变大小的边框(Border)、客户区、水平滚动条和竖直滚动条。更为复杂的窗口还包括工具条、状态条等。图2-2为一个标准的应用程序窗口-精简的文件管理器。,.,25,图2-2一个标准的Windows窗口,一个标准的Windows窗口,.,26,图2-3一个扩展的Windows窗口,.,27,其它类型的窗口:控制框、对话框和消息框,控制框是用来获得用户特定信息的窗口,通常与其他窗口连用,最典型的是与对话框合用。对话框是含有一个或多个控制框的窗口。应用程序可以通过对话框提示用户提供完成某一个命令所需的输入。例如打开文件对话框。如图2-4,.,28,文件打开对话框,图2-4文件打开对话框,图2-5Windows消息框。,.,29,标题栏:,用于显示应用程序定义的一行正文,通常是应用程序的名字或说明该窗口的用途,由应用程序在创建窗口时指定。标题栏使得用户可以通过鼠标或其它的定点设备来移动窗口。标题栏的正文可以通过API函数SetWindowText来改变。,菜单栏:,菜单栏列出了应用程序所支持的命令,菜单栏中的项是命令的主要分类。用户可以选择一个命令让应用程序完成该任务。,System菜单栏:,System菜单是一个由Windows系统创建和管理的菜单,其中包含标准的菜单项设置,用户可以通过它改变窗口的大小或对窗口重新定位或关闭应用程序。,.,30,窗口边框:,窗口边框是围绕窗口四周的一个区域,通过它用户可以用鼠标或其他定点设备改变窗口的大小。,客户区:,客户区是窗口的一部分,应用程序用于显示输出,如正文或图形。应用程序必须提供一个称为窗口过程的函数,来处理窗口的输入并在客户区输出。,水平/竖直滚动条:,水平和竖直滚动条把鼠标或键盘的输入转换成一个数值,应用程序用来按水平或竖直方向移动客户区的内容。,最大/最小化/关闭按钮:,最大/最小化按钮用来改变窗口的大小和位置,关闭按钮用来关闭当前窗口。,.,31,应用程序可以通过函数CreateWindow或CreateWindowEx来创建窗口。CreateWindowEx比CreateWindow多一个参数dwExStyle(扩展风格)。Windows系统还提供了另外一些函数DialogBox、CreateDialog以及MessageBox来创建特殊用途的窗口,例如对话框和消息框。,创建窗口,.,32,HWNDCreateWindowEx(DWORDdwExStyle,/扩展窗口风格LPCTSTRlpClassName,/注册的窗口类名LPCTSTRlpWindowName,/窗口名DWORDdwStyle,/窗口风格intx,/左上角x坐标位置inty,/左上角y坐标位置intnWidth,/窗口宽度intnHeight,/窗口高度HWNDhWndParent,/父窗口句柄HMENUhMenu,/窗口菜单句柄HINSTANCEhInstance,/应用程序实例句柄LPVOIDlpParam,/附加窗口创建数据);,CreateWindowEx的函数原型如下:,.,33,窗口类(lpClassName):,每一个窗口都从属于某一窗口类,应用程序必须在创建某类窗口之前注册窗口类,窗口类定义了窗口的外观和特性。窗口类的主要部分是一个窗口过程,也就是接收和处理给窗口的输入和请求的函数,Windows系统以消息的形式给窗口提供输入或请求。Windows系统提供了一些预定义的窗口类,应用程序通常要注册自己的一些窗口类。,窗口名(lpWindowName):,窗口名是便于用户识别一个窗口的正文字符串。主窗口、对话框或消息框一般是在其标题栏中显示窗口名。对于控制,窗口名的外观取决于控制的类。应用程序可以通过SetWindowText来改变窗口名,通过GetWindowTextLength和GetWindowText来获得当前窗口名。,窗口扩展风格(dwExStyle):,指定窗口的扩展风格。这个扩展风格可以参见MSDN中的PlatformSDK:WindowsUserInterface部分。,.,34,参数说明,窗口风格(dwStyle):,窗口风格是一个命名的常量,由它定义窗口类没有指定的窗口外观及特性。,1.覆盖窗口(overlapped):覆盖窗口是一个顶层窗口,具有标题栏、边框和客户区,用作应用程序的主窗口。也可以有一个System菜单、最小化和最大化按钮以及滚动条,通过给CreateWindowEx中的dwStyle参数加入WS_OVERLAPPED风格创建。2.弹出窗口(popup):是一个特定类型的覆盖窗口,通常对应于对话框、消息框以及其他显示在应用程序主窗口之外的临时窗口中。标题栏可选,其他与覆盖窗口一样。通过给CreateWindowEx中的dwStyle参数加入WS_POPUP风格创建。3.子窗口(child):子窗口具有WS_CHILD风格,被限制在其父窗口的客户区中,应用程序通常就是用子窗口把主窗口的客户区分成几个功能区域。子窗口必须有一个父窗口,父窗口可以是任意类型的窗口,甚至是child窗口。应用程序可以为子窗口提供除了菜单以外的任何东西。,.,35,参数说明,窗口可以有一个父窗口,有父窗口的窗口称之为子窗口,由父窗口提供的坐标系统对子窗口进行定位。父窗口会影响到子窗口的外观(例如裁剪)。如果一个窗口没有父窗口或者它的父窗口是桌面窗口,称之为顶层窗口。应用程序通过EnumWindows来获得每一个顶层窗口的句柄,再由EnumWindows把每一个顶层窗口的句柄传给应用程序定义的回调函数。,父窗口或属主窗口(hWndParent):,一个窗口可以拥有别的窗口,也可以被别的窗口所拥有。被拥有的窗口总是在其父窗口的前面,当它的父窗口最小化时,该窗口同时被隐藏,并随父窗口的销毁而销毁。子窗口占据父窗口的一部分客户区,不能越出。,.,36,子窗口标志或菜单句柄(hMenu):,对于覆盖窗口或者弹出窗口,这是一个标志窗口使用的菜单的句柄,如果该参数为NULL,那么使用缺省的窗口类的菜单。如果这是一个子窗口,那么hMenu就是子窗口标志(Identifier,简称ID)。这个标志是子窗口用来唯一的表明自己的整数。当子窗口向父窗口发送通知消息(NotifyMessage)时能够告诉父窗口是哪一个子窗口在发送消息。,每个窗口都有它自己的位置、尺寸和在Z轴中的次序。一般窗口位置由相对于屏幕左上角的坐标决定;如果是子窗口则相对于它的父窗口客户区左上角的坐标决定。窗口的尺寸是其高度和宽度的像素值;窗口在Z轴中的次序则是窗口在覆盖窗口堆中的位置。,位置、尺寸和在Z轴中的次序(hWndParent):,.,37,实例句柄(hInstance):,每一个Windows程序都有一个与之相应的实例句柄,Windows系统在应用程序开始的时候就为它提供了实例句柄。由于每一个应用程序可以有多个拷贝,Windows系统就是利用实例句柄来区分应用程序的不同实例。该参数在Windows95/98中可以是任意实例句柄(指定一个任意的实例作为窗口的属主,在WindowsNT/2000中,出于安全性考虑,该参数被忽略(ignored)了。,创建数据(lpParam):,每一个窗口都可以有与之相应的由应用程序定义的创建数据。在窗口第一次被创建时,Windows系统把数据的指针传给所创建窗口的窗口过程,窗口过程用这些数据初始化应用程序定义的变量。当Windows创建一个窗口后,会向窗口过程发送一个WM_CREATE消息,这个消息的LPARAM参数中保存着一个CREATESTRUCT结构,有关窗口的特性等内容,包括创建数据都在这个结构中,该结构中的LPVOIDlpCreateParams就是lpParam指针。应用程序可以通过响应WM_CREATE消息来根据创建数据初始化窗口中的变量。,.,38,裁剪(Clip):,Windows系统不会自动的裁剪父窗口客户区中的子窗口,这就意味着父窗口可以在子窗口的位置上进行绘制。但如果父窗口具有WS_CLIPCHILDREN风格,Windows系统就会自动裁剪父窗口客户区中的子窗口,这样父窗口就不能在上面进行绘制。子窗口覆盖同一客户区中的其他窗口,一个或多个其它的子窗口共享一个父窗口叫做兄弟窗口。兄弟窗口也可以在相互间的客户区中绘画,除非其中某个子窗口具有WS_CLIPSIBLINGS风格。如果应用程序为子窗口指定了这个风格,那么在绘画时,位于这个子窗口中的兄弟窗口的任何部分就被裁减。,窗口相关的术语,.,39,被禁止的窗口(DisabledWindow):窗口是可以被禁止的,被禁止的窗口不再接收键盘或鼠标输入,但它能够接受来自其他窗口或者其他应用程序的以及Windows系统的消息;应用程序可以通过EnableWindow来激活或者禁止一个窗口。使用IsWindowEnabled来确定一个窗口是否被禁止;如果当前一个子窗口或其他的子孙窗口有输入焦点,那么当父窗口被禁止时,其子孙窗口也会失去输入焦点。,前台窗口和后台窗口(ForegroundWNDPROClpfnWndProc;intcbClsExtra;intcbWndExtra;HINSTANCEhInstance;HICONhIcon;HCURSORhCursor;HBRUSHhbrBackground;LPCTSTRlpszMenuName;LPCTSTRlpszClassName;WNDCLASS,*PWNDCLASS;,.,47,类附加空间(cbClsExtra):,Windows为系统中每一个窗口类管理一个WNDCLASS结构。在应用程序注册一个窗口类时,它可以让Windows系统为该结构分配和追加一定字节数的附加内存空间,这部分内存称之为类附加内存,由属于这种窗口类的所有窗口共享,类附加内存空间用于存储类的附加信息。函数SetClassWord和SetClassLong用来把某一个值复制到类附加内存中,并可以通过GetClassWord和GetClassLong来检取这些值。,.,48,窗口附加空间(cbWndExtra):,Windows为每一个窗口管理一个内部数据结构,在注册一个窗口类时,应用程序能够指定一定字节的附加内存空间,称为窗口附加内存。在创建这类窗口时,Windows系统就为窗口结构分配和追加指定数目的窗口附加内存空间,应用程序可以用这部分内存存储窗口特有的数据。函数SetWindowWord和SetWindowLong可以把某一个值复制到附加内存,函数GetWindowWord和GetWindowLong可以检取这些值。,.,49,关于窗口函数的举例:,AdjustWindowRectAdjustWindowRectExBringWindowToTopChildWindowFromPointCloseWindowCreateWindowCreateWindowExDeferWindowPosDestroyWindowGetNextWindowGetParentGetTopWindowGetWindowGetWindowPlacementGetWindowRectGetWindowTextGetWindowTextLengthMoveWindowSetDeskWallpaperSetForegroundWindowSetParentSetWindowPosSetWindowText,.,50,窗口和图形子系统的变迁,1、Windows95、98、Me绝大多数图形和窗口管理函数代码为不可重入的,最终导致应用程序在多数时间以单线程运行2、NT3.1、3.5图形和窗口管理函数代码为可重入的,但位于用户态进程中(CSRSS.EXE)3、NT4.0以后,图形引擎移入到核心态设备驱动程序中(WIN32K.SYS),.,51,Win32子系统服务器进程,用户进程1,用户线程11,用户线程12,用户线程13,用户进程2,用户线程21,用户线程22,用户线程11,用户线程12,用户线程13,用户线程21,用户线程22,快速LPC,不引起调度事件,但产生描述表切换,.,52,Win32子系统的核心设备驱动程序,1、窗口管理器:控制窗口显示;管理屏幕输出;收集来自键盘、鼠标和其它设备的输入信息;将用户信息传给应用程序。2、图形设备接口(GDI):图形输出设备的函数库,包括线条、文本、绘图、和图形操作函数。,.,53,窗口的关系,DesktopWindow,.,54,思考:,保护模式下,所有的进程都有自己独立的虚拟地址空间,这些窗口之间如何协同工作?典型情况下,如果用户进行关机操作,对于未保存的工作,会看到是否保存的提示窗口,系统是如和判断应用程序存在未保存的工作呢?,.,55,消息的本质:,WINDOWS是由事件驱动的抢先式的多任务系统,必须能同时处理多个事件,WINDOWS中事件的触发与管理借助消息机制来实现,消息可理解为一个事件,系统为应用程序生成一消息队列,消息在其中被投递与发送,应用程序只要从其消息队列中取出消息,逐一处理就可以了消息是Windows下一切应用程序间,包括Windows自身,进行交互和通讯的渠道,是Windows实现对运行在其下的所有应用程序进行控制及应用程序对Windows进行响应的交互手段.,.,56,消息举例:关机操作,Csrss.exe,.,57,消息的产生,操作系统内部根据一定的逻辑产生硬件中断设备驱动程序消息,消息的载体消息队列,系统消息队列线程消息队列,.,58,Windows与DOS程序的区别,DOS程序顺序的,过程驱动的程序设计方法有一个明显的开始,明显的过程及一个明显的结束程序能直接控制程序事件或过程的顺序Windows程序由事件的发生来控制,所有的事件是无序的是密切围绕消息的产生与处理而展开的,主要任务是对应用程序要发出或要接收的消息进行排序和管理,.,59,消息的主体:,typedefstructtagMSGHWNDhwnd;/所属对象UINTmessage;/消息标识WPARAMwParam;/附加参数LPARAMlParam;/附加参数DWORDtime;/投递时间POINTpt;/光标位置MSG;,.,60,消息的处理,系统缺省窗口过程系统控制窗口在一般情况下的外在表象和内部逻辑自定义窗口过程由开发者负责相关的窗口外在表象和内部逻辑不做处理的消息,发送给缺省窗口过程,.,61,消息的路由,通过线程消息队列处理排队消息用户输入的结果,移动鼠标、敲击键盘还包含时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)直接发送给窗口过程非排队消息调用特定的Windows函数Windows系统一般通过发送非排队消息把影响某窗口的事件通知窗口,.,62,消息环:,应用程序必须删除和处理投递到它的线程消息队列中的消息,单一线程的应用程序一般是在它的WinMain函数中使用一个消息环来删除消息,并把消息发送到相应的窗口过程进行处理。具有多线程的应用程序在创建窗口的每一个线程中使用一个消息环。消息环和以看作是一个水泵,不断地从消息队列中提取消息,使得后来的消息可以放入到队列中,.,63,消息环主体:,while(GetMessage(TranslateMessage将虚拟键消息转换为字符消息DispatchMessage分派消息到对应的窗口过程,.,64,消息过滤:,BOOLGetMessage(LPMSGlp

温馨提示

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

评论

0/150

提交评论