Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3133893
  • 博文数量: 117
  • 博客积分: 10003
  • 博客等级: 上将
  • 技术积分: 5405
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-23 09:34
文章分类

全部博文(117)

文章存档

2011年(1)

2010年(10)

2009年(69)

2008年(37)

分类: LINUX

2008-09-28 10:42:14

问题1:当A、B窗口上图像有刷新时,它们只会刷新没有被C窗口遮住的地方,window是是如何实现这个功能的?它的原理是什么?
--------------------------------
这个问题涉及windows如何计算无效区域和裁减区域的问题,具体的原理你可以看“windows图形编程”这本书中的第五章,windows更新区域的一些说明,以及GDI+程序设计这本书中的第七章裁减和失效,这部分内容对于如何理解windows如何高效处理界面有很好的注解

        问题2:当把C窗口关闭的时候,A和B窗口是不是整个窗口都重画了还是只重画了被C窗口遮住的部分?这个问题扩展一下,是不是桌面上每个窗口关闭时,其它窗口都收到重画的消息?如何判断哪个窗口需要重画哪个窗口不需要重画?
------------------------------------------------------------------------
这个问题么还是一句话,取决于当时被标记为无效区域的部分是哪些,按照正常理解,只有被遮住的部分会被标为无效区域,需要重绘。扩展的问题,负责管理每个窗口重绘的是windows,他把所有被标为无效区域的都重新计算一个需要绘制的最小矩形,在下一次wm_pain消息处理的时候进行重绘,并非分别处理


InvalidatedRect  
使一个矩形无效,需要重绘该矩形,在该矩形做一个重绘的标记,当下一次WM_PAINT发出的时候,该矩形被重绘.
使显示矩形区无效,WM_PAINT会对无效的区域重画
函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色。    

UpdateWindow
强制发出一个WM_PAINT消息  
会发送一条WM_PAINT,但不进入消息队列,呼叫立即更新窗口    
只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT      

如果希望立即刷新无效区域,可以在调用InvalidateRect之后调用UpdateWindow,如果客户区的任一部分无效,
则UpdateWindow将导致Windows用WM_PAINT消息调用窗口过程(如果整个客户区有效,则不调用窗口过程)。
这一WM_PAINT消息不进入消息队列,直接由WINDOWS调用窗口过程。窗口过程完成刷新以后立刻退出,
WINDOWS将控制返回给程序中UpdateWindow调用之后的语句。

ValidateRect(HWND)使窗口有效,在下一个WM_PAINT消息发出的时候,把该矩形从需要更新的标记清除,使之不需要更新
阅读(2202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~