BngThea 发表于 2017-8-3 11:24:03

《Windows SDK》032 区域和裁剪

一 核心知识点
* 区域
可以设置一个空间,用来进行某些操作,这些操作只在这个区域中生效
同画笔画刷,区域也是一个GDI对象,使用结束后需要用 DeleteObject 释放其占用的内存

* 创建并填充区域
Windows 提供了很多API函数用来创建不同形状的区域,包括但不仅仅有矩形,椭圆形,多边形等
创建的区域只包含其内部区域,边框线不属于区域(当点落在边框时,调用PtInRegion将返回false)
用 FillRgn 函数对创建好的区域进行内部填充
用 FrameRgn 函数对创建好的区域进行边框上色

* 区域的合并与剪裁
如果仅仅是绘制一个区域,很多API函数可以直接完成,区域的强大之处在于可以用 CombineRgn 函数
将两个区域进行合并,从而形成所需的形状组合
用 SelectClipRgn 将所需的形状进行剪裁,从而使得其内部的绘图等操作不在外部体现

二 新API函数
* CreateRectRgn(0, 0 , 100, 100) 和 CreateRectRgnIndirct(&rect)
这两个函数用于创建一个矩形区域
这两个函数的参数都指向一个矩形的参数


* CreateEllipiticRgn(0, 0, 100, 100) 和 CreateEllipiticRgnIndirect(&rect)
这两个函数用于创建一个椭圆形区域
这两个函数的参数都指向一个限定矩形的参数


* CreatePolygonRgn(apt, 4, ALTERNATE)
该函数用于创建一个多边形区域

第一个参数:POINT结构数组,存放多边形的各个顶点
第二个参数:顶点个数
第三个参数:填充模式,可以是ALTERNATE(默认的,交替模式)或 WINDING(螺旋模式)


* CreatePolyPolygonRgn(apt, asz, 4, ALTERNATE)
该函数用于创建多个多边形区域

第一个参数:POINT结构数组,存放多边形的各个顶点
第二个参数:int数组,存放每个多边形的顶点个数
第三个参数:多边形个数
第四个参数:填充模式,可以是ALTERNATE(默认的,交替模式)或 WINDING(螺旋模式)


* FillRgn(hdc, hRgn, hBrush)
该函数使用指定的画刷填充指定的区域

第一个参数: 环境句柄
第二个参数: 指定的区域
第三个参数: 指定的画刷

* PaintRgn(hdc, hRgn)
该函数用当前画刷填充指定区域,FillRgn 函数的阉割版本,只能使用当前画刷

* FrameRgn(hdc, hRgn, hBrush, 1, 1)
该函数使用指定的画刷填充指定的区域的边框

第一个参数: 环境句柄
第二个参数: 指定的区域
第三个参数: 指定的画刷
第四五个参数:换算的垂直水平宽度,逻辑单位,一般为1

* CombineRgn(hRgnC, hRgnA, hRgnB, RGN_OR)
该函数将区域A和区域B合并为区域C

第一个参数:合并后的区域句柄
第二三个参数:两个需要合并的区域句柄
第四个参数:合并方式,可以说一下的某一种——
1 RGN_AND   取交集 == A && B
2 RGN_COPY取第一个区域 ==A
3 RGN_DIFF取第一个区域中未和第二个区域重叠的部分 == A - B
4 RGN_OR    取并集 == A || B
5 RGN_XOR   取并集减去交集 == A || B - (A && B)

* SelectClipRgn(hdc, hRgn)
该函数选择一个区域作为指定设备环境的当前剪裁区域

第一个参数: 指定的环境设备句柄
第二个参数: 指定的选择区域
页: [1]
查看完整版本: 《Windows SDK》032 区域和裁剪