zl程序教程

您现在的位置是:首页 >  其它

当前栏目

WinAPI: ExtCreateRegion - 区域变换

区域 变换
2023-09-11 14:22:50 时间

转载:http://www.cnblogs.com/del/archive/2008/06/03/1212534.html

相似函数: SetWorldTransform



本例效果图:


代码文件:
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 FormPaint(Sender: TObject);    
 procedure RadioGroup1Click(Sender: TObject);    
procedure FormDestroy(Sender: TObject);   end;

var   Form1: TForm1;

implementation

{$R *.dfm}

var   cvs: TCanvas;   Rgn: HRGN;

procedure TForm1.FormCreate(Sender: TObject);
begin   
cvs := TCanvas.Create;   
cvs.Handle := GetDC(Handle);  
 RadioGroup1.Items.CommaText :=   '原始,横向移动,纵向移动,横向比例,纵向比例,放大,缩小,水平镜像,垂直镜像,横向斜切,纵向斜切,旋转';   
RadioGroup1.ItemIndex := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin   
DeleteObject(Rgn);   cvs.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin  
 {绘制}  
 cvs.Brush.Color := clSilver;  
 cvs.Brush.Style := bsDiagCross;  
 FillRgn(cvs.Handle, Rgn, cvs.Brush.Handle);  
 cvs.Brush.Color := clRed;  
 cvs.Brush.Style := bsSolid;   
FrameRgn(cvs.Handle, Rgn, cvs.Brush.Handle, 2, 2);
end;


procedure TForm1.RadioGroup1Click(Sender: TObject);
var   
RgnDataSize: Integer; {区域数据缓冲区的大小}   
RgnData: PRgnData;    {区域数据指针}   
TXF: TXForm;          {坐标转换的矩阵结构}
begin  
 cvs.Font.Size := 120;  
 cvs.Font.Style := [fsBold];   
SetBkMode(cvs.Handle, TRANSPARENT);   
{建立路径}   BeginPath(cvs.Handle);  
 cvs.TextOut(100, 0, 'F');   
EndPath(cvs.Handle);   
{将路径转换为区域}  
 Rgn := PathToRegion(cvs.Handle);  
 {获取区域数据}   
RgnDataSize := GetRegionData(Rgn, 0, nil);  
 GetMem(RgnData, RgnDataSize);  
 GetRegionData(Rgn, RgnDataSize, RgnData);  
 case RadioGroup1.ItemIndex of     
0: begin {原始效果, 无变换}       
TXF.eM11 := 1;       
TXF.eM12 := 0;       
TXF.eM21 := 0;       
TXF.eM22 := 1;       
TXF.eDx := 0;       
TXF.eDy := 0;     
end;     
1: begin 
{右移 100}       
TXF.eM11 := 1;       
TXF.eM12 := 0;       
TXF.eM21 := 0;       
TXF.eM22 := 1;       
TXF.eDx := 100;       
TXF.eDy := 0;     
end;     
2: begin 
{上移 40}       
TXF.eM11 := 1;       
TXF.eM12 := 0;       
TXF.eM21 := 0;       
TXF.eM22 := 1;      
 TXF.eDx := 0;       
TXF.eDy := -40;     
end;     
3: begin
 {横向放大 1.5}       
TXF.eM11 := 1.5;       
TXF.eM12 := 0;      
 TXF.eM21 := 0;       
TXF.eM22 := 1;       
TXF.eDx := 0;       
TXF.eDy := 0;    
 end;     
4: begin 
{纵向放大 1.5}       
TXF.eM11 := 1;       
TXF.eM12 := 0;       
TXF.eM21 := 0;       
TXF.eM22 := 1.5;       
TXF.eDx := 0;       
TXF.eDy := 0;    
 end;     
5: begin
 {整体放大 1.5 倍}       
TXF.eM11 := 1.5;       
TXF.eM12 := 0;       
TXF.eM21 := 0;      
 TXF.eM22 := 1.5;       
TXF.eDx := 0;      
 TXF.eDy := 0;     
end;    
 6: begin 
{整体缩小一半}       
TXF.eM11 := 0.5;       
TXF.eM12 := 0;       
TXF.eM21 := 0;       
TXF.eM22 := 0.5;       
TXF.eDx := 0;       
TXF.eDy := 0;    
 end;     
7: begin
 {水平镜像}       
TXF.eM11 := -1;       
TXF.eM12 := 0;      
 TXF.eM21 := 0;       
TXF.eM22 := 1;       
TXF.eDx := 200; 
{需要右移一些才能看到}       
TXF.eDy := 0;    
 end;     
8: begin {垂直镜像}      
 TXF.eM11 := 1;      
 TXF.eM12 := 0;      
 TXF.eM21 := 0;      
 TXF.eM22 := -1;      
 TXF.eDx := 0;       
TXF.eDy := 200;
 {需要下移一些才能看到}    
 end;     9: begin {横向斜切}       
TXF.eM11 := 1;       
TXF.eM12 := 0.75;      
 TXF.eM21 := 0;       
TXF.eM22 := 1;      
 TXF.eDx := 0;       
TXF.eDy := 0;    
 end;     
10: begin
 {纵向斜切}      
 TXF.eM11 := 1;       
TXF.eM12 := 0;       
TXF.eM21 := 0.75;      
 TXF.eM22 := 1;      
 TXF.eDx := 0;      
 TXF.eDy := 0;     
end;     
11: begin 
{旋转 30 度}       
TXF.eM11 := Cos(30*PI/180);       
TXF.eM12 := Sin(30*PI/180);       
TXF.eM21 := -Sin(30*PI/180);       
TXF.eM22 := Cos(30*PI/180);       
TXF.eDx := 0;       
TXF.eDy := 0;    
 end;   
end;  
 {执行变换并重绘}   
Rgn := ExtCreateRegion(@TXF, RgnDataSize, RgnData^);  
 Repaint;  
 FreeMem(RgnData);
end;

end.

窗体文件:
object 
Form1: TForm1  
 Left = 0   
Top = 0   
Caption = 'Form1'  
 ClientHeight = 259  
 ClientWidth = 433  
 Color = clBtnFace   
Font.Charset = DEFAULT_CHARSET   
Font.Color = clWindowText   
Font.Height = -11  
 Font.Name = 'Tahoma'   
Font.Style = []   
OldCreateOrder = False   
Position = poDesktopCenter  
 OnCreate = FormCreate  
 OnDestroy = FormDestroy  
 OnPaint = FormPaint   
PixelsPerInch = 96   
TextHeight = 13   
object RadioGroup1: TRadioGroup    
 Left = 320     
Top = 8     
Width = 103    
 Height = 243    
 Caption = 'RadioGroup1'    
 TabOrder = 0    
 OnClick = RadioGroup1Click  
 end
end

TXForm 结构定义在 Windows 单元的 12205 - 12213 行(Delphi 2007).