相似函数: 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