WinAPI: CombineRgn - 区域合成

来源:互联网 发布:晨曦软件下载 编辑:程序博客网 时间:2024/05/16 17:18
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;interfaceuses  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  endend
原创粉丝点击