第五章绘制PPT课件_第1页
第五章绘制PPT课件_第2页
第五章绘制PPT课件_第3页
第五章绘制PPT课件_第4页
第五章绘制PPT课件_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

.,1,第五章绘制,绝大部分应用程序都必须使用屏幕来显示所处理的数据,应用程序必须能够绘制图像、画图表和写文本。由于Windows系统是一个多任务操作系统,这就要求应用程序在访问屏幕时必须相互协同操作。为了保持多个应用程序协同流畅的执行,Windows系统管理所有的屏幕输出,应用程序使用窗口而不是屏幕来作为他们的主要输出设备。Windows提供了显示设备描述表(DeviceContext)来唯一的对应一个窗口,应用程序使用显示设备描述表把显示输出定向到某个给定的窗口。在窗口内绘制能够防止一个应用程序和其他应用程序的输出相互干扰,又可以使应用程序之间相互共存,这样就可以发挥Windows图形能力的最大优越性。,绘制的时机:当窗口大小改变、滚动条位置改变、移动窗口、显示文件中的数据等操作发生时,应用程序就要进行绘制。Windows管理诸如窗口移动或改变窗口大小等操作,如果一个窗,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,2,口的内容时,Windows对窗口内准备更新的区域打上标记,在有机会时给窗口发送一条WM_PAINT消息,应用程序根据这条消息决定那些区域需要更新,并在必要时执行绘制。有些操作是由应用程序来管理的,例如显示打开的文件、选择显示的数据等。应用程序给受这些操作影响而需要更新的窗口区域打上标记,并产生一个WM_PAINT消息,在下次有机会时发出并处理。如果一个操作立即需要反馈,应用程序可以不等待WM_PAINT消息而立即绘制。例如,应用程序请求用户突出显示用户选择的区域时,就马上绘制而不等待WM_PAINT消息。如果要在一个窗口内绘制,应用程序首先要获得这个窗口的显示设备描述表(DC)的句柄。应用程序大部分绘制操作是在处理WM_PAINT消息的过程中执行的,在这种情况下,应用程序调用BeginPaint函数来获得显示设备描述表。应用程序在其他地方绘制时,例如WinMain中,或者在处理键盘或鼠标消息时绘制,就调用GetDC或GetDCEx函数来获得显示设备描述表。,WM_PAINT消息:通常应用程序是在响应WM_PAINT消息时执行窗口绘制。如果窗口的改变影响到客户区的内容时,Windows就给这个窗口发送一条,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,3,WM_PAINT消息。只有当应用程序的消息队列中没有其他消息时,Windows才发送这条消息。接收到WM_PAINT消息后,应用程序调用BeginPaint函数获得显示设备描述表,并调用相关的GDI函数来进行绘制操作。绘制操作结束后,应用程序调用EndPaint函数释放设备描述表。调用BeginPaint函数获得设备描述表时,Windows将设备描述表的裁剪区域设置为需要更新的窗口区域与对用户可见的区域的交集。窗口中只有改变了的区域才需要重新绘制,对裁剪区域以外的任何尝试都被裁剪掉,并不会出现在屏幕上。在BeginPaint返回之前,Windows还可能给窗口过程发送WM_NCPAINT和WM_ERASEBKGND消息,这些消息指示应用程序绘制非客户区和窗口背景。BeginPaint填充PAINTSTRUCT结构,例如窗口需要更新的区域的大小,表示是否已经绘制窗口背景的标识等,应用程序使用这些信息来优化绘制。例如根据需要更新的区域来决定绘制的范围,如果应用程序的输出很简单,就可以忽略更新区域而在整个窗口中绘制,由Windows来剪裁那些不必要的输出。系统自动丢弃延伸到裁剪域外的绘制。BeginPaint将窗口的更新区域设置为NULL,避免不断的产生重,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,4,画。如果应用程序处理WM_PAINT时没有调用BeginPaint或者没有清除更新区域,那么Windows会继续向窗口发送WM_PAINT消息。所以,应用程序从WM_PAINT处理中退出时,必须清除更新区域。应用程序完成绘制后应调用EndPaint函数,对大多数窗口来说,EndPaint函数释放设备描述表,使其他窗口可以得到它。如果BeginPaint隐藏了插入符(防止插入符影响绘制操作),EndPaint还要显示插入符。,更新区域:更新区域指示窗口内过时的或无效的需要重新绘制的区域,Windows使用更新区域为应用程序产生WM_PAINT消息,并使应用程序更新窗口内容的时间最短。Windows确定更新某个窗口后,就把更新区域的大小设置为窗口内的无效区域。设置更新区域并不使应用程序立即开始绘制,应用程序继续检查它消息队列中的消息,直到不剩下消息为止。这时Windows开始检查更新区域,如果更新区域不为空,就给窗口过程发送一个WM_PAINT消息。通常应用程序不应直接绘制,而是应当产生WM_PAINT消息进行绘制。,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,5,应用程序可以使用InvalidateRect或者InvalidateRgn函数来设置更新区域。这两个函数把给定的矩形或区域田间到更新区域上,并把它和Windows或应用程序先前增加到更新区域中的内容合并。InvalidateRect和InvalidateRgn并不产生WM_PAINT消息,而是由Windows累加这些函数所产生的变化和窗口处理它的消息队列中的其它消息时所产生的变化。通过累加这些变化,窗口就能一次处理所有的改变,而不需要一步一步的改变(提高绘制效率)。ValidateRect和ValidateRgn从更新区域中去掉指定的矩形或区域,从而使窗口的某一区域有效。如果要求窗口在接受WM_PAINT消息之前就已经更新了更新区域中的某个指定屏幕区域,就需要用到这些函数。,GetUpdateRect和GetUpdateRgn函数获取当前更新区域,GetUpdateRect获取包含整个更新区域的最小矩形,GetUpdateRgn获取更新区域本身。BeginPaint清空更新区域,因此在BeginPaint后调用GetUpdateRect和GetUpdateRgn将获得一个空的更新区域。ExcludeUpdateRgn把更新区域排除在显示设备描述表的裁剪域之外。在窗口内绘制时,这个函数用于处理WM_PAINT消息以外的窗口内绘制。这样可以避免在一个区域内重复绘制。,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,6,同步与异步绘制:在处理WM_PAINT时执行的多数绘制都是异步绘制,也就是说,在窗口区域成为无效到发出WM_PAINT消息之间有一段延迟。在这段时间内,应用程序一般是在处理消息环或执行其它操作。延迟的原因是Windows通常都把窗口内的绘制作为一个低优先级的操作。有时也需要同步绘制-在窗口的某部分无效后立即绘制。典型的应用程序在创建窗口后立即绘制主窗口,告诉用户应用程序已经开始正确的执行了。对按钮之类的控制框窗口,Windows也是同步绘制的,因为这些窗口起到用户的输入焦点的作用。尽管带有简单绘制例程的窗口能够同步绘制,但是所有这样的绘制应尽快执行,并且不应影响应用程序响应用户输入的能力。UpdateWindow和RedrawWindow允许同步绘制。如果更新区域非空,UpdateWindow直接给这个窗口发送WM_PAINT消息。RedrawWindow也发送WM_PAINT消息,但就如何绘制窗口给了应用程序更多的控制。例如是否绘制背景和非客户区。这些函数都是直接给窗口发送WM_PAINT消息,而不管应用程序消息队列中是否有消息。所有请求耗时较长的窗口绘制操作都应采用异步绘制,以避免在绘制窗口时阻塞太多的消息。同样,为提高绘制效率,通常应当,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,7,小的无效区域合并成大的无效区域统一绘制。,显示设备描述表:显示设备描述表是Windows创建的设备描述表。应用程序使用它来绘制窗口。Windows为窗口的输出准备显示设备描述表,用它取代显示设备为窗口设置绘制对象、颜色和式样。应用程序根据显示设备描述表调用GDI函数时,GDI函数使用描述表中的信息在给定的窗口上进行输出,而不会妨碍其它窗口或屏幕的其它部分。Windows提供了五种类型的显示设备描述表:公共型、类型、父型、私有型和窗口型。公用型、类型和私有型设备描述表允许在一个给定窗口的客户区内进行绘制。父型和窗口型设备描述表允许在窗口的任何区域绘制。尽管父型设备描述表也允许在父窗口内绘制,但不提倡这种做法。Windows根据窗口类风格中指定的显示设备描述表的类型为窗口提供一个公共型、类型、父型或私有型的设备描述表。只有应用程序显式地请求时Windows才提供一个窗口型设备描述表,例如调用函数GetWindowDC和GetDCEx函数。任何情况下,应用程序都能通过函数WindowFromDC来确定显示设备描述表代表的窗口。,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,8,显示设备描述表基本元素:,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,9,应用程序可以调用SelectObject,SetMapMode和SetTextColor来改变显示设备描述表中的属性值。对于公共型、父型和窗口型的设备描述表而言,其属性的改变不会保留。应用程序释放这些设备描述表后,设备描述表返回到高速缓存,映射模式和裁剪域等当前选择被丢弃。对类型和私有型设备描述表的改变可以保留,应用程序必须显式地设置每个属性才能把设备描述表恢复成初始值。,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,10,公共显示设备描述表:公共DC用于在窗口内绘制。如果一个窗口的窗口类没能显式指明一种显示设备描述表风格,Windows就为这个窗口提供一个公共DC。公共DC用于在绘制时不需对DC的属性做太多的改变的窗口。应用程序获取公共DC时,Windows调整原点使之与客户区的左上角对齐,同时还设置裁剪域,把对DC的输出裁剪到客户区中。任何可能出现在客户区外的输出都被裁剪掉。如果应用程序使用BeginPaint来获得公共DC,Windows把更新区域包括在裁剪域内,以便于进一步限定输出。应用程序释放公共DC时,Windows把其中的各属性恢复成默认值。释放一个DC也将释放掉应用程序已经选进DC的绘制对象,因此应用程序在释放DC前就不必在释放绘制对象。总之,应用程序无论何时都不能认为公共DC被释放后还保留非默认的选择值。,私有显示设备描述表:私有DC使得应用程序不必每次在窗口内绘制时都获取并初始化显示DC。如果一个窗口的DC中许多属性和默认值不一样,那么每次绘制时都要改变许多属性,这时私有DC的应用就会减少DC的准备时,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,11,间。应用程序通过在窗口类中指明CS_OWNDC风格让Windows为一个窗口创建私有DC。Windows在创建一个该类的窗口时就为它建立一个私有DC。私有DC开始具有同公共DC相同的默认属性值,但应用程序可以随时修改他们,Windows在窗口的生命期内一直保留着改变后的DC。一个窗口创建后,应用程序可以随时调用GetDC来获取这个窗口的私有DC句并,但只能获取一次,并保存这个句柄,以后可以任意使用。由于私有DC不是显示DC高速缓存的一部分,因此应用程序不需要使用ReleaseDC来释放DC。,类显示设备描述表:使用类DC,应用程序可以把一个单一的DC用于属于某个给定窗口类的所有窗口。类DC通常用于相同属性值绘制的控制框。和私有DC一样,类DC可以节省准备DC的时间。如果一个窗口具有CS_CLASSDC风格的窗口类,Windows给这个窗口提供一个类DC。,序言,WM_PAINT,更新区域,同步与异步绘制,显示设备描述表,.,12,窗口显示设备描述表:窗口DC使得应用程序能够在窗口的任何区域绘制,包括非客户区。窗口DC的典型用法是定制窗口的特定外观,即响应WM_NCPAINT和WM_NCACTIVATE消息的应用程序。应用程序获取窗口DC时,Windows将原点设置位窗口的左上角而不是客户区的左上角,同样裁剪区域设置位包含窗口而不只是客户区。Windows将窗口DC的当前属性值设置为和公共DC的默认值一样。应用程序可以改变这些值,但是DC释放后,Windows并不保留改变。窗口显示DC也占用高速缓存空间,因此使用后应尽快释放。,父显示设备描述表:父DC使应用程序能够最小化设置窗口裁剪域所需的时间。典型的应用是把父DC使用于控制框的加速绘制。这个控制框没有私有DC或类DC。例如Windows为按钮控制和编辑控制使用父DC。父DC只用于子窗口,不用于顶层窗口或弹出式窗口。Windows给具有CS_PARENTDC风格的窗口类的窗口提供父DC,窗口可以通过GetDC来获得,即使父窗口的DC是私有型的或类型的,Wind

温馨提示

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

评论

0/150

提交评论