IGPMatrix 的属性与方法:
//方法 IGPMatrix.Reset; { 重置 Matrix 得到单位矩阵(斜对角线是1其他是0) } IGPMatrix.Translate(); { 平移 } IGPMatrix.Scale(); { 放缩 } IGPMatrix.Rotate(); { 旋转(沿(0,0)点, 顺时针) } IGPMatrix.RotateAt(); { 沿指定点, 顺时针旋转 } IGPMatrix.Shear(); { 剪切(或叫错切、斜切) } IGPMatrix.Invert; { 反转 } IGPMatrix.Multiply(); { 与指定的 Matrix 相乘 } IGPMatrix.TransformPoint(); { 对指定点应用此 Matrix 变换 } IGPMatrix.TransformPoints(); { 对点数组应用此 Matrix 变换 } IGPMatrix.TransformVector(); { 对指定点应用此 Matrix 变换中的缩放和旋转变换 } IGPMatrix.TransformVectors(); { 对点数组应用此 Matrix 变换中的缩放和旋转变换 } IGPMatrix.SetElements(); { 设置 Matrix 各元素 } IGPMatrix.Clone; { 克隆副本 } IGPMatrix.Equals(); { 判断是否相等 } //属性 IGPMatrix.Elements; { 获取 Matrix 各元素构成的数组 } IGPMatrix.OffsetX; { 获取 Matrix.Elements.DX } IGPMatrix.OffsetY; { 获取 Matrix.Elements.DY } IGPMatrix.IsInvertible; { 判断 Matrix 是否可逆转 } IGPMatrix.IsIdentity; { 判断 Matrix 是否是单位矩阵(斜对角线是1其他是0) }
下面的例子用到了其中的 Reset、Translate、Scale、Rotate、Shear、Invert 方法:
代码:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} uses GdiPlus; var Matrix: IGPMatrix; //用字符串的形式返回 Matrix 数据, 用于查看 function ViewMatrix(Matrix: IGPMatrix): string; const fmt = '%f'#9'%f'#9'0'#13#10#13#10'%f'#9'%f'#9'0'#13#10#13#10'%f'#9'%f'#9'1'; begin Result := Format(fmt, [Matrix.Elements.M11, Matrix.Elements.M12, Matrix.Elements.M21, Matrix.Elements.M22, Matrix.Elements.DX, Matrix.Elements.DY]); end; //初识化 procedure TForm1.FormCreate(Sender: TObject); begin Button1.Caption := '重置 (Reset)'; Button2.Caption := '反转 (Invert)'; Button3.Caption := '平移 (Translate)'; Button4.Caption := '比例 (Scale)'; Button5.Caption := '旋转 (Rotate)'; Button6.Caption := '错切 (Shear)'; Matrix := TGPMatrix.Create; end; //绘图 procedure TForm1.FormPaint(Sender: TObject); var Image: IGPImage; Graphics: IGPGraphics; Rect: TGPRect; begin Image := TGPImage.Create('C:\GdiPlusImg\Apple.gif'); Rect.Initialize(20, 20, 80, 80); Graphics := TGPGraphics.Create(Handle); Graphics.MultiplyTransform(Matrix); Graphics.DrawImage(Image, Rect); Graphics.DrawRectangle(TGPPen.Create($FFFF0000, 2), Rect); end; //重置到单位矩阵 procedure TForm1.Button1Click(Sender: TObject); begin Matrix.Reset; Memo1.Text := ViewMatrix(Matrix); Repaint; end; //反转变换 procedure TForm1.Button2Click(Sender: TObject); begin Matrix.Invert; Memo1.Text := ViewMatrix(Matrix); Repaint; end; //平移变换 procedure TForm1.Button3Click(Sender: TObject); begin Matrix.Translate(1.5, 3); Memo1.Text := ViewMatrix(Matrix); Repaint; end; //比例变换 procedure TForm1.Button4Click(Sender: TObject); begin Matrix.Scale(0.75, 1.5); Memo1.Text := ViewMatrix(Matrix); Repaint; end; //旋转变换 procedure TForm1.Button5Click(Sender: TObject); begin Matrix.Rotate(15); Memo1.Text := ViewMatrix(Matrix); Repaint; end; //错切变换 procedure TForm1.Button6Click(Sender: TObject); begin Matrix.Shear(0.2, 0.5); Memo1.Text := ViewMatrix(Matrix); Repaint; end; end.
窗体:
object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 200 ClientWidth = 377 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnPaint = FormPaint PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 185 Top = 8 Width = 90 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end object Button2: TButton Left = 281 Top = 8 Width = 90 Height = 25 Caption = 'Button2' TabOrder = 1 OnClick = Button2Click end object Button3: TButton Left = 185 Top = 39 Width = 90 Height = 25 Caption = 'Button3' TabOrder = 2 OnClick = Button3Click end object Button4: TButton Left = 281 Top = 39 Width = 90 Height = 25 Caption = 'Button4' TabOrder = 3 OnClick = Button4Click end object Button5: TButton Left = 185 Top = 70 Width = 90 Height = 25 Caption = 'Button5' TabOrder = 4 OnClick = Button5Click end object Memo1: TMemo Left = 185 Top = 111 Width = 181 Height = 81 Lines.Strings = ( 'Memo1') TabOrder = 5 end object Button6: TButton Left = 281 Top = 70 Width = 90 Height = 25 Caption = 'Button6' TabOrder = 6 OnClick = Button6Click end end