Delphi GDI对象之剪切区域
原文链接: http://www.cnblogs.com/pchmonster/archive/2012/07/05/2577627.html
剪切区域(Clipping Regions)
Regions是屏幕的一部分,它可用于控制绘图的那部分画布。TCanvas类具有ClipRect属性,但这个属性只是只读的,要改变裁减区,必须使用Windows API,仍以前面的例子为例,并加以修改来说明裁剪区是如何工作的,下面是代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
var Bitmap: TBitmap; Rgn: HRGN; { long型} begin ClearCanvas; { 清除当前画布的内容} Bitmap := TBitmap.Create; Bitmap.LoadFromFile('handshak.bmp'); Rgn := CreateRectRgn(50, 50, 250, 250); SelectClipRgn(Canvas.Handle, Rgn); Canvas.Draw(0, 0, Bitmap); Bitmap.Free; end; |
运行该程序时,将会看到仅有一部分位图显示出来,如下图:
SelectClipRgn函数设置画布的裁剪区为由坐标(50, 50, 250, 250)确定的矩形。位图仍然被绘制在它以前的位置上,但是现在仅有一部分位图(由裁剪区所定义的)可见,在裁剪区之外的部分都被略去。
裁剪区不一定是规则的,仍以前面的例子为例并将它更加有缺,删除创建规则区域的CreateRectRgn函数,用下面的代码代替:
1
2
3
4
5
6
7
8
9
10
11
12
|
var Bitmap: TBitmap; Rgn: HRGN; { long型} begin ClearCanvas; { 清除当前画布的内容} Bitmap := TBitmap.Create; Bitmap.LoadFromFile('handshak.bmp'); Rgn := CreateEllipticRgn(30, 30, 250, 250); { 圆形区域} SelectClipRgn(Canvas.Handle, Rgn); Canvas.Draw(0, 0, Bitmap); Bitmap.Free; end; |
重新执行该程序,这时,位图被限制在一个圆周区域内,如下图:
我们再来试试其他类型的裁剪区。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
const Points: array[0..3] of TPoint = ((X:160; Y:0), (X:0; Y:160), (X:160; Y:320), (X:320; Y:160)); var Bitmap: TBitmap; Rgn: HRGN; { long型} begin ClearCanvas; { 清除当前画布的内容} Bitmap := TBitmap.Create; Bitmap.LoadFromFile('handshak.bmp'); Rgn := CreatePolygonRgn(Points, 4, ALTERNATE); { 菱形区域} SelectClipRgn(Canvas.Handle, Rgn); Canvas.Draw(0, 0, Bitmap); Bitmap.Free; end; |
这次使用的菱形区域。程序中Points数组定义创建该菱形区域的点,CreatePolygonRgn函数根据Points数组定义的点创建一个区域。
可使用所想要的点数,不必指定封闭点,因为区域自动将起点与终点连接起来,重新运行运行看看得到是什么图形。如下定义:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
const Points: array[0..11] of TPoint = ((X:0; Y:0), (X:120; Y:0), (X:120; Y:60), (X:180; Y:60), (X:180; Y:120), (X:120; Y:120), (X:120; Y:180), (X:0; Y:180), (X:0; Y:120), (X:60; Y:120), (X:60; Y:60), (X:0; Y:60)); var Bitmap: TBitmap; Rgn: HRGN; { long型} begin ClearCanvas; { 清除当前画布的内容} Bitmap := TBitmap.Create; Bitmap.LoadFromFile('handshak.bmp'); Rgn := CreatePolygonRgn(Points, 12, ALTERNATE); { 菱形区域} SelectClipRgn(Canvas.Handle, Rgn); Canvas.Draw(0, 0, Bitmap); Bitmap.Free; end; |
Note
这个程序也显示出如何初始化一组const记录。其程序代码如下:
123const
Points: array[0..3] of TPoint =
((X:160; Y:0), (X:0; Y:160), (X:160; Y:320), (X:320; Y:160));
TPoint有两个字段:X和Y。注意列出字段名,后跟冒号和赋给该字段的值(例如: X:80),也请注意X和Y字段均被赋值且被括号括住,这里出现了四组,因为该Points数组有4个元素。这时定义和初始化一组const记录的唯一方法。
处理一些绘图操作时裁剪区可能非常有用,用户可能不需要经常使用裁剪区,但是当需要使用时裁剪区便是非常有价值的。
以上代码均在Delphi7中测试通过,示例代码下载:GDI之位图与调色板.rar
Delphi GDI对象之剪切区域的更多相关文章
- Delphi GDI对象之绘制位图
http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579334.html 绘制位图(Drawing Bitmaps) 绘制位图听起来似乎很难, ...
- Delphi GDI对象之绘制文本
转载:http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579185.html 基本绘图操作(Basic Drawing Operations ...
- Delphi GDI对象之脱屏位图(Offscreen Bitmaps),也叫内存位图
http://www.cnblogs.com/pchmonster/archive/2012/07/09/2583613.html 脱屏位图(Offscreen Bitmaps) 脱屏位图,也叫内存位 ...
- Delphi GDI对象之脱屏位图(Offscreen Bitmaps)
脱屏位图(Offscreen Bitmaps) 脱屏位图,也叫内存位图,普遍用于Windows程序设计中.它在内存中制作图像,然后利用Draw方法在屏幕上显示出来.当用户想更快的在屏幕上绘制图像时,脱 ...
- 【笨嘴拙舌WINDOWS】GDI对象之位图
GDI对象在windows中可以描述成为一次绘画操作时可使用的抽象工具.包括(画笔.画刷.字体.区域.调色板.位图等) GDI对象里的对象概念和在编程领域中面向对象编程的对象概念是不一样的! GDI对 ...
- VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)
上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObje ...
- VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)
上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. 鸡啄米依然是通过实例的方式来说明画刷的用法.此实例要实现的功能是,对话框上有一 ...
- Delphi GDI+ 安装方法
[转]Delphi GDI+ 安装方法转自:万一博客(http://www.cnblogs.com/del/)GDI+ 是 Windows 的一个函数库, 来自 Windows\System32\GD ...
- VS2010-MFC(图形图像:GDI对象之画刷CBrush)
转自:http://www.jizhuomi.com/software/248.html 上一节讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. ...
随机推荐
- Discuz常见小问题-如何关闭验证码
进入后台,在防灌水,验证设置中可以切换哪些情况下是否使用验证码 如果启用验证码,也客户修改验证码的难度,样式.最后点击提交,完成之后可以退出到前台,测试是否能够不用验证码自动登录
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- android中使用SharedPreferences存储数据
使用SharedPreferences存储数据还是比较简单的 1.添加或修改数据(没有数据就添加,有数据就是修改): SharedPreferences.Editor editor = getShar ...
- TQ2440开发板挂载U盘出现乱码
解决方法:配置内核 make menuconfig File Systems ---> DOS/FAT/NT Filesystems ---> (utf8) D ...
- LLVM lli llc
http://zke1ev3n.me/2016/01/18/%E5%9F%BA%E4%BA%8ELLVM%E7%9A%84%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7%86/ h ...
- vim note write
Try: :vert sb N which will open a left vertical split (by default, unless you have modified some opt ...
- C# lambda方式取出前十个经常联系的手机号码
这个场景适合所有要查找相同字符串的个数并返回一个序列 //取出前十个经常联系的手机号(即:计算重复手机个数最多的前十个) ).Select(i=>).ToList();
- 分布式交易系统的并发处理, 以及用Redis和Zookeeper实现分布式锁
交易系统 交易系统的数据结构 支付系统API通常需要一个“订单号”作为入参, 而实际调用API接口时使用到的往往不是真正意义的业务订单号, 而是交易订单号. 支付系统的API会使用“商户号+订单号” ...
- XML制作RSS源
什么是RSS源?看到这片文章的人相信都知道.自己博客首页不就是一个吗? 好吧,先来一个简单点的.直接就是死代码:详细如何使用就看RSS使用标准吧! <?xml version = "1 ...
- C# 正则表达式过滤危险HTML
下面是两个过滤的方法 /// <summary> /// 此处过滤危险HTML方法 /// </summary> /// <param name="html&q ...