• 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;

    运行该程序时,将会看到仅有一部分位图显示出来,如下图:

    image

    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;

    重新执行该程序,这时,位图被限制在一个圆周区域内,如下图:

    image

     

    我们再来试试其他类型的裁剪区。代码如下:

    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数组定义的点创建一个区域。

    image

     

    可使用所想要的点数,不必指定封闭点,因为区域自动将起点与终点连接起来,重新运行运行看看得到是什么图形。如下定义:

    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;

    image

    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

  • 相关阅读:
    使用SandCastle生成代码注释文档
    如何修改默认的ModelState错误提示:字段{0}必须是一个数字
    2011总结 致:过去的30年
    CentOS下安装、配置Nginx,配合IIS做负载均衡
    灵活应用js调试技巧解决样式问题
    扩展IList对象,实现深拷贝扩展方法
    IE8对JS数组,采用属性遍历的解析差异
    如何开始Github
    Response.Clear 还是 Response.ClearHeaders
    URLRoutingModule如何处理静态文件?
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4639242.html
Copyright © 2020-2023  润新知