文档章节

WinAPI: CombineRgn - 区域合成

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 396
阅读 17
收藏 0
CombineRgn(
  p1: HRGN;     {合成后的区域}
  p2, p3: HRGN; {两个原始区域}
  p4: Integer   {合并选项; 见下表}
): Integer;     {有四种可能的返回值}

//合并选项:
RGN_AND  = 1;
RGN_OR   = 2;
RGN_XOR  = 3;
RGN_DIFF = 4;
RGN_COPY = 5; {复制第一个区域}

//返回值:
ERROR         = 0; {错误}
NULLREGION    = 1; {空区域}
SIMPLEREGION  = 2; {单矩形区域}
COMPLEXREGION = 3; {多矩形区域}

 
 
 
 
 

 

 

  
本例效果图:



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  Rgn1,Rgn2,Rgn: HRGN;

//初始化
procedure TForm1.FormCreate(Sender: TObject);
begin
  {建立两个原始区域}
  Rgn1 := CreateEllipticRgn(20, 20, 120, 160);
  Rgn2 := CreateEllipticRgn(70, 20, 170, 160);

  {Rgn 是用来接受运算结果的, 但函数 CombineRgn 要求它必须是已存在的区域, 这里虚拟一个}
  Rgn := CreateRectRgnIndirect(BoundsRect);

  RadioGroup1.Items.CommaText := '两个原始区域,RGN_AND,RGN_OR,RGN_XOR,RGN_DIFF,RGN_COPY';
  RadioGroup1.ItemIndex := 0;
end;

//见到窗体时先绘制一次
procedure TForm1.FormActivate(Sender: TObject);
begin
  RadioGroup1Click(nil);
end;

//主要代码
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  Repaint;
  if RadioGroup1.ItemIndex = 0 then
  begin
    Canvas.Brush.Color := clSilver;
    Canvas.Brush.Style := bsDiagCross;
    FillRgn(Canvas.Handle, Rgn1, Canvas.Brush.Handle);
    FillRgn(Canvas.Handle, Rgn2, Canvas.Brush.Handle);

    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := clRed;
    FrameRgn(Canvas.Handle, Rgn1, Canvas.Brush.Handle, 2, 2);
    FrameRgn(Canvas.Handle, Rgn2, Canvas.Brush.Handle, 2, 2);
  end else begin
    CombineRgn(Rgn, Rgn1, Rgn2, RadioGroup1.ItemIndex);

    Canvas.Brush.Color := clSilver;
    Canvas.Brush.Style := bsDiagCross;
    FillRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle);

    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := clRed;
    FrameRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle, 2, 2);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeleteObject(Rgn1);
  DeleteObject(Rgn2);
  DeleteObject(Rgn);
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 182
  ClientWidth = 300
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnActivate = FormActivate
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object RadioGroup1: TRadioGroup
    Left = 189
    Top = 8
    Width = 106
    Height = 166
    Caption = 'RadioGroup1'
    TabOrder = 0
    OnClick = RadioGroup1Click
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/05/26/1208004.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
桌面精灵制作解析

最近一直在做一个涉及到很多Windows Region区域处理的项目,在开展的过程中,另我想起了几年前看到的一篇讲制作桌面精灵的文章([url]http://www.vckbase.com/vckbase/vckbase12/vc/nonctrls...

余二五
2017/11/16
0
0
MFC开发QQ游戏客户端登录界面

开始: 按下“高级设置”后 图片均采用QQ游戏的BMP图。 图片界面是利用对图片的拼接并计算Rgn后进行CombineRgn ,最后SetWindowRgn实现。 上面的广告是一个HTML页面。 可以通过MFC中的HtmlVie...

长平狐
2012/11/19
245
0
请问如何实现java图片合成时图像透明区域选取删除

@andy.zheng 你好,想跟你请教个问题:请问如何实现java图片合成时图像透明区域选取删除? 需求如下:我有A图和B图,需要合成。A图有一部分区域是透明区域,我希望B图像同A图像合成时,A为背...

limiyun
2012/12/05
858
3
使用canvas在前端实现图片合成

看着总结的不错,我也就拿来主义了,做个记录,侵权必删 图片合成最常见的需求有验证码图片,亦或者图片加水印等,这种实现一般都是后端实现的。 随着HTML5发展和现代浏览器的占比越来越高,...

xllily_11
02/26
0
0
Android P 图形显示系统(一)硬件合成HWC2

硬件合成HWC2 Hardware Composer HAL (HWC) 是 SurfaceFlinger 用来将 Surface 合成到屏幕。HWC 可以抽象出叠加层和 2D 位块传送器等,其主要是帮忙GPU完成一些工作。 SurfaceFlinger是一个系...

夕月风
08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

技术工坊|如何开发一款以太坊钱包(深圳)

【好消息!】HiBlock区块链技术工坊已经成功举办了26期,其中北京1期,西安1期,成都2期,上海22期。经常有社区的小伙伴问定期举办技术工坊的除了上海以外,其他城市有没有?现在区块链技术工...

HiBlock
13分钟前
1
0
Redis 梳理笔记

安装 安装gccyum install gcc-c++下载传输到服务器上解压tar -xzvf *.tar.gzcd redis-3.2.9编译make安装 make PREFIX=/usr/local/redis install将配置文件拷贝出来cp redis...

晨猫
15分钟前
0
0
PyCharm flask 'Debug mode off' 调试模式关闭的解决方法

flask的几种debug模式的方法 # 1.app.run 传参debug=trueapp.run(debug=True) #2 设置app的配置app = Flask(__name__)app.config['DEBUG'] = True #3 配置文件方式# config.py中添加d...

yimingkeji
22分钟前
1
0
聊聊storm TridentWindowManager的pendingTriggers

序 本文主要研究一下storm TridentWindowManager的pendingTriggers TridentBoltExecutor.finishBatch storm-core-1.2.2-sources.jar!/org/apache/storm/trident/topology/TridentBoltExecut......

go4it
28分钟前
1
0
java实现多线程两种基本方式

我们在开发当中经常会使用到多线程,这里我们来写两个小案例通过最基本的两种方式继承Thread类或实现Runnable接口来实现一个多线程。 继承Thread类 我们可以通过继承Thread类,并重写run()方...

王子城
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部