GDI+学习及代码总结之------区域
来源:互联网 发布:电脑软件未响应 编辑:程序博客网 时间:2024/06/07 12:07
转自:http://blog.csdn.net/harvic880925/article/details/9115125
在GDI+中,对于区域的部分基本上使用了GDI的区域构造函数与合并方法,所以我们先看看GDI中的区域是如何构造与操作的。
GDI中区域构建与操作
一、基本函数
创建矩形区域:
创建椭圆区域:创建多边形区域:合并区域:对于CombinMode有四个取值:RGN_COPY:原样复制hrgnSrc1中的区域,一般不用这个,没太大意义;
RGN_AND:合成的区域是hrgnSrc1和hrgnSrc2的重叠部分;
RGN_DIFF:合成的区域是hrgnSrc1中不包含hrgnSrc2的部分;
RGN_OR:合成的区域同时包含hrgnSrc2和hrgnSrc2;
RGN_XOR:合成的区域同时包含hrgnSrc2和hrgnSrc2,但不包含hrgnSrc2和hrgnSrc2的重叠部分;
区域的句柄可用的4个绘图函数:
删除一个区域
上面两个函数也会以WM_PAINT消息作出反应
剪裁区域
首先是创建剪裁区域
上面两个函数都是将一个区域选进设备描述表来创建自己的剪裁区域,这个剪裁区域使用设备坐标。
对剪裁区域的操作函数:
注意:
GDI会为剪裁区域创建一个副本,所以在将新创建的区域选进设备描述表后,用户可以删除这个区域。
CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, iCombine); 中使用的3个区域句柄必须都是有效的,即都要是创建了的。
在调用CombineRgn函数后,源区域即可以删除了,删除不会影响新合成的区域
看在GDI中使用区域函数的一个示例:(区域抠图)
原理:先用图片大小的矩形构造一个目的区域,所以这个区域的大小就是整个图片的大小,然后从图片的左上角(0,0)开始,按照从上到下、从左到右的顺序形成长宽都为1的矩形(就是一个像素大小),如果矩形中的背景是白色,将之从目的区域中去除,所以最终剩下的区域就是主画面的区域了。这就是“抠”出主界面区域的关键思路所在。
先看下原来的图片:
抠图代码:
GDI+中的区域构建与操作
一、构造函数(Region):
这里有两个非常重要的构建函数,要说明一下:对于Region(hRgn):我们很多时候,可以用GDI中区域函数构建区域;然后使用这个构建函数,构建Regin变量,然后使用GDI+中的函数fillRegion啥啥的;对于Region(Rect):Region类只提供了这么一个矩形构造函数,没有GDI中的椭圆、多边形区域的构建方法,所以当我们构建椭圆、多边形区域时,就是使用GDI了。
二、区域操作(构建区域)
对于GDI中的操作,我们知道CombineRgn的最后一个参数,可以实现对区域的RGN_AND、RGN_DIFF、RGN_OR、RGN_XOR
在GDI+中,Regin类中,也有对区域的操作函数,同样实现了GDI中的区域操作功能,它们分别是:
简单的看一个示例吧,(异并集的)
三、用矩形表示区域
对于特定的区域,我们都可以使用多个矩形来表示其大致形状。事实上,如果矩形足够小,一定数量的矩形就能够精确表示区域的形状,也就是说,一定数量的矩形所合成的形状,也可以代表区域的形状。Region类的GetRegionScans函数,实现了获取组成区域的矩形集的功能,其调用格式如下:
参数:matrix:[in]绘制平面上的坐标变换矩阵
rects:[out]代表矩形集的数组
count:[out]矩形集的数量,该值可以通过GetRegionScansCount函数获取。
示例:
四、击中测试区域(判断点是否在区域内)
击中测试(HitTest),简单地说就是判断一个点是否位于指定的区域内。Region类的成员函数IsVisible提供了这样一个功能。而且还提供了扩展:不仅可以测试一个点是否位于指定的区域中,还可以测试两矩形区域是存否在交集。IsVisible的调用格式为:
参数说明:g:[in]绘图平面;
point:[in]点坐标;
rect及x,y,width,height:[in]定义欲测试的矩形区间;
示例:
考虑这样一个应用,当鼠标移动到指定区域时,输出字符串“yes”,否则擦掉这个字符串(擦除操作是用填充背景颜色完成的);
在View类中的OnMouseMove(UINT nFlags, CPoint point)添加如下代码:
- GDI+学习及代码总结之------区域
- GDI+学习及代码总结之------区域
- GDI+学习及代码总结之------区域
- GDI+学习及代码总结之------区域
- GDI+学习及代码总结之------区域
- GDI+学习及代码总结之------画线、区域填充、写字
- GDI+学习及代码总结之------画线、区域填充、写字
- GDI+学习及代码总结之------画线、区域填充、写字
- GDI+学习及代码总结之-----画笔
- GDI+学习及代码总结之-----画笔
- GDI+学习及代码总结之------色彩与图像
- GDI+学习及代码总结之------画刷Brush
- GDI+学习及代码总结之------文本与字体
- GDI+学习及代码总结之------图像的基本处理
- GDI+学习及代码总结之------文本与字体
- GDI+学习及代码总结之------图像的基本处理
- GDI+学习及代码总结之------画刷Brush
- GDI+学习及代码总结之------图像的基本处理
- 手把手| 用Python代码建个数据实验室,顺利入坑比特币
- 在wandboard上加载Android6.0
- 机器学习之从极大似然估计到最大熵原理以及EM算法详解
- jmeter分布式操作之远程启动功能
- 根据网络图片地址获取资源的字节流
- GDI+学习及代码总结之------区域
- 数据结构实验之查找二:平衡二叉树
- springboot动态配置定时任务2种方式,整合Quartz多线程并发执行多个定时任务配置
- ava.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
- Python爬虫总结
- 文件上传至FTP报413错误
- 关于Android的.so文件你所需要知道的
- 静态化整体思路
- directshow原理分析之filter到filter的连接