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

posted on 2008-06-03 01:03  万一  阅读(4582)  评论(2编辑  收藏  举报