在线笔记
全部博文(596)
分类: LINUX
2013-01-28 17:18:42
什么是剪裁区域?
剪裁区域就是设备描述表中的区域,用于描画处理。
所以一切还要从区域说起:
设备描述表中的区域
与画笔、画刷和位图一样,区域也是GDI对象,需要调用DeletObject来删除创建的区域
区域类型句柄为HRGN
创建矩形区域
hRgn = CreateRectRgn(xLeft, yTop, xRight, yBottom);
hRgn = CreateRectRgnIndirect(&rect);
创建椭圆区域
hRgn = CreateEllipticRgn(xLeft, yTop, xRight, yBottom);
hRgn = CreateEllipticRgnIndirect(&rect);
创建圆角的矩形区域
CreateRoundRectRgn
创建多边形区域
hRgn = CreatePolygonRgn(&point, iCount, iPolyFillMode);
iPolyFillMode 是 ALTERNATE 或者 WINDING
ALTERNATE:封闭区域内部画随便一条射线,只有这条射线能穿过了奇数条边界线时才填充封闭区域
WINDING:封闭区域内部画随便一条射线,只有这条射线能穿过了奇数条边界线时才填充封闭区域,这和ALTERNATE一样。如果这条射线穿过偶数条边界线,如果一个方向(封闭区的边界线方向)的边界线数与另一个方向的边界线数不相等,就填充区域。
创建多个多边形区域
CreatePolyPolygonRgn
区域的作用:
iRgnType = CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, iCombine);
这一函数将两个源区域(hSrcRgn1, hSrcRgn2)组合起来并用句柄hDestRgn指向组合成的目标区。这3个区域句柄必须都有效,但是hDestRgn所指向的原来的区域被破坏掉了。
------------------------------------------------------
iCombine含有的值 新区域
RGN_AND 两个源区域的公共部分
RGN_OR 两个源区域的全部
RGN_XOR 两个源区域的全部除去公共部分
RGN_DIFF hSrcRgn1不在hSrcRgn2中的部分
RGN_COPY hSrcRgn1的全部(忽略hSrcRgn2)
---------------------------------------------------------------------
从CombineRgn返回的iRgnType值是下列之一:
NULLREGION:表示得到一个空区域
SIMPLEREGION:表示得到一个简单的矩形、椭圆或多边形
COMPLEXREGION:表示得到一个多个矩形、椭圆或多边形的组合
ERROR:表示出错了
区域的句柄可用的4个绘图函数:
FillRgn(hdc, hRgn, hBrush); 类似FillRect
FrameRgn(hdc, hRgn, hBrush, xFrame, yFrame); 类似FrameRect
InverRgn(hdc, hRgn); 类似InvertRect
PaintRgn(hdc, hRgn); 用设备描述表中的当前画刷填充所指的区域。
所有这些函数都假设区域是逻辑坐标定义的
删除一个区域
DeleteObject(hRgn);
Windows的2个作用于区域而不是矩形的函数
InvalidateRgn(hwnd, hRgn, bErase); 类似于InvalidateRect
ValidateRgn(hwnd, hRgn); 类似于ValidateRect
上面两个函数也会以WM_PAINT消息作出反应
下面开始说明剪裁区域了
首先是创建剪裁区域
SelectObject(hdc, hRgn);
SelectClipRgn(hdc, hRgn);
上面两个函数都是将一个区域选进设备描述表来创建自己的剪裁区域,这个剪裁区域使用设备坐标。
对剪裁区域的操作函数:
ExcludeClipRect 用于将一个矩形从剪裁区域里排除掉
IntersectClipRect 用于创建一个新的剪裁区域,他是前一个剪裁区域与一个矩形的交集
OffsetClipRgn 用于将剪裁区域移动到客户区的另一部分
注意:
GDI会为剪裁区域创建一个副本,所以在将新创建的区域选进设备描述表后,用户可以删除这个区域。
CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, iCombine); 中使用的3个区域句柄必须都是有效的,即都要是创建了的。
在调用CombineRgn函数后,源区域即可以删除了,删除不会影响新合成的区域