Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15530682
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: C/C++

2007-08-15 11:16:42

1._ClipContext.ClientRect存放即将进行剪切计算的最小矩形区域
2._ClipContext.Cnt表示剪切域计算了多少次
3._ClipContext.CurRect表示上一次计算出的窄条矩形区域,
  _ClipContext.ClientRect矩形区域是由很多个_ClipContext.CurRect窄条
  矩形区域组成的,窄条矩形区域的出现顺序是:由上到下、由左到右
4._Findy1()查找Z序链表中(pWin->hNext为比pWin在Z序上高的窗体,所以它可以剪切pWin可见区域)
  与pRect矩形区域存在相交关系的控件,这些控件将会影响到pRect->y1值,
  pRect->y1将与该控件的上边界y0或者该控件的下边界y1对齐.
  当到达最左边时,即:r.x0 ==_ClipContext.ClientRect.x0时,r.x1和r.y1都会调整为最大,
  r.y1 = _ClipContext.ClientRect.y1;
  r.x1 = _ClipContext.ClientRect.x1;
  进而计算下一个y1底线值.

5._Findx0()首先将矩形变成一条竖线r.x1=r.x0,之后查找Z序链表中
  与竖线矩形pRect能够相交的控件,这些控件将改变r.x0的值,
  如果控件与该竖线相交,那么r->x0向右平移至控件右边界x1+1处,
  即:r.x0 = rWinClipped.x1+1;超过_ClipContext.ClientRect.x1就跳转进入
  下一窄条计算goto NextStripe;下一窄条将沿用上一次计算出来的y1+1作为r.y0

6._Findx1()执行该函数之前先调整r.x1=_ClipContext.ClientRect.x1然后慢慢缩小r.x1;
  计算剪切区域右边界x1,其值为所有控件中最靠左边的控件x0-1值

7.最后_ClipContext.CurRect = r;
  因此可以看到,_ClipContext.CurRect就是可以此次绘制动作,因为Z序遮盖原因,
  所能绘制的一个窄条区域,那么需要绘制的矩形区域_ClipContext.ClientRect是由
  多个间隔的_ClipContext.CurRect窄条区域组成的,所以对于一个背景图片的绘制
  实际上是被所有Z序值大的可视窗体进行剪切计算出的一个一个_ClipContext.CurRect
  镂空矩形拼接而成的,能绘制的区域_ClipContext.CurRect就是那些个方形小洞洞.
8.WM__ActivateClipRect()使用_SetClipRectUserIntersect(&_ClipContext.CurRect);
  最终把_ClipContext.CurRect转换到GUI_Context.ClipRect,
  对于用户自己定义了一个剪切范围GUI_Context.WM__pUserClipRect,那么_ClipContext.CurRect
  将与用户定义的范围进行运算,找到子集,使得_ClipContext.CurRect缩小到最小.
 
综上可知:首先计算出y1底线值,之后开始从左到右计算一个个的剪切矩形区,
        当该y1对应的_ClipContext.ClientRect.x0~_ClipContext.ClientRect.x1之间
        的所有剪切矩形全部计算完毕之后,计算下一个y1底线值,开始周而复始的运算
        直到r.y0 >_ClipContext.ClientRect.y1时,所有剪切域都已经计算完毕,ok可以return 0;
        顺序:_Findy1()->_Findx0()->_Findx1().
        可以参照图《μC/GUI-v3.90a之Dialog窗体调用GUIClear剪切域填充过程图》
阅读(3988) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~