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剪切域填充过程图》
阅读(3983) | 评论(0) | 转发(1) |