HRGN 剪裁区域

Posted fzy456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HRGN 剪裁区域相关的知识,希望对你有一定的参考价值。

什么是剪裁区域?

剪裁区域就是设备描述表中的区域,用于描画处理。

 

所以一切还要从区域说起: 

设备描述表中的区域

与画笔、画刷和位图一样,区域也是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函数后,源区域即可以删除了,删除不会影响新合成的区域

 

转自 https://blog.csdn.net/zjw1349547081/article/details/29803359

以上是关于HRGN 剪裁区域的主要内容,如果未能解决你的问题,请参考以下文章

GDI-ExtSelectClipRgn将指定区域与当前剪辑区域组合在一起

获取剪裁线可见区域长度 d3

石英和剪裁区域

多边形剪裁:仅“可见”区域

OS: 剪裁UIImage部分不规则区域

在 Three.Js 中剪裁一个体积,给出黑色区域而不是内部材质