原文链接: 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记录。其程序代码如下:

1
2
3
const
  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对象之剪切区域的更多相关文章

  1. Delphi GDI对象之绘制位图

    http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579334.html 绘制位图(Drawing Bitmaps) 绘制位图听起来似乎很难, ...

  2. Delphi GDI对象之绘制文本

    转载:http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579185.html 基本绘图操作(Basic Drawing Operations ...

  3. Delphi GDI对象之脱屏位图(Offscreen Bitmaps),也叫内存位图

    http://www.cnblogs.com/pchmonster/archive/2012/07/09/2583613.html 脱屏位图(Offscreen Bitmaps) 脱屏位图,也叫内存位 ...

  4. Delphi GDI对象之脱屏位图(Offscreen Bitmaps)

    脱屏位图(Offscreen Bitmaps) 脱屏位图,也叫内存位图,普遍用于Windows程序设计中.它在内存中制作图像,然后利用Draw方法在屏幕上显示出来.当用户想更快的在屏幕上绘制图像时,脱 ...

  5. 【笨嘴拙舌WINDOWS】GDI对象之位图

    GDI对象在windows中可以描述成为一次绘画操作时可使用的抽象工具.包括(画笔.画刷.字体.区域.调色板.位图等) GDI对象里的对象概念和在编程领域中面向对象编程的对象概念是不一样的! GDI对 ...

  6. VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)

    上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObje ...

  7. VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)

    上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. 鸡啄米依然是通过实例的方式来说明画刷的用法.此实例要实现的功能是,对话框上有一 ...

  8. Delphi GDI+ 安装方法

    [转]Delphi GDI+ 安装方法转自:万一博客(http://www.cnblogs.com/del/)GDI+ 是 Windows 的一个函数库, 来自 Windows\System32\GD ...

  9. VS2010-MFC(图形图像:GDI对象之画刷CBrush)

    转自:http://www.jizhuomi.com/software/248.html 上一节讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. ...

随机推荐

  1. 解决Android Studio提示gradle project sync failed报错的解决方法

    运行的时候报错,提示:gradle project sync failed 1.打开AS,切换到project目录结构依次进入目录app->gradle->gradle-wrapper.p ...

  2. SpringBoot添加对Mybatis分页插件PageHelper的支持

    1.修改maven配置文件pom.xml,添加对pageHelper的支持: <!--pagehelper--> <dependency> <groupId>com ...

  3. iOS xcodebuile 自动编译打包ipa

    xcodebuild -alltargets clean 首先进入到工程文件所在的目录.比如我的文件某个工程放在(.xcodeproj文件所在的目录) /Users/xxx/xxx 然后ce /Use ...

  4. 推荐五星级C语言学习网站

    www.cprogrammingexpert.com (此网站,配合了大量动画,每一行代码,配合一副图片) 下面截取了部分的gif动画,大家可以认真看看, 相信作者花了很多心血,去制作这些动画. sc ...

  5. Sqlite执行insert or ignore 或insert or replace语句。

    Sqlite执行insert or ignore 或insert or replace语句. ,); ,); 上面的第一条语句是每次执行时,如果不存在,则添加,如果存在,则更新. 上面的第二条语句是每 ...

  6. python中string和十六进制、二进制互转

    def str_to_hex(s): return ' '.join([hex(ord(c)).replace('0x', '') for c in s]) def hex_to_str(s): re ...

  7. 【Fanvas技术解密】HTML5 canvas实现脏区重绘

    先说明一下,fanvas是笔者在企鹅公司开发的,即将开源的flash转canvas工具. 脏区重绘(dirty rectangle)并不是一门新鲜的技术了,这在最早2D游戏诞生的时候就已经存在. 复杂 ...

  8. django之创建第8-2个项目-数据库数据提取之过滤操作符相关

    """1)age__gt = 16等价于age > 162)age = 163)age__gte = 16等价于age >= 164)name__contai ...

  9. Arduino——My-Clock项目 发布时间:2018-12-31

    技术:Arduino.光敏传感器.DHT11.DS1302.OLED显示屏   概述 项目My-Clock是一个环境监测时钟,接入光敏传感器和温湿度传感器监测环境信息,加入DS1302模块用于获取时间 ...

  10. android官方资料

    android develop – Guides http://developer.android.com/guide/ android develop – API Reference http:// ...