文档章节

GdiPlus[47]: IGPMatrix 矩阵(二)

涂孟超
 涂孟超
发布于 2014/09/26 15:34
字数 719
阅读 3
收藏 0

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

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2009/12/24/1631729.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
GDI+里面的问题。。。。。。。。。。

error C2248: “Gdiplus::Bitmap::Bitmap”: 无法访问 private 成员(在“Gdiplus::Bitmap”类中声明) 1> c:\program files\microsoft sdks\windows\v7.0a\include\gdiplusheaders.h(630) : ......

xxdd
2013/10/24
65
0
vs 2005 添加GDI配置

在VS2005当中由于自带了GDI+的开发包,所以不需要在安装GDI开发包,这些头文件的位置由VS中的$(WindowsSdkDir)/include自动包含进来了 下午自己添加了好几次,总是出现有报错,,在 stdafx.h...

种地瓜
2015/12/08
85
0
MFC边框重绘

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 pragma once incl......

江河海流
2016/01/30
509
0
在DLL中调用createwindows,报错1407

//初始化 AtlAxWinInit(); Gdiplus::GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); //名字和当......

哈大哈傻瓜
2016/03/27
136
0
MFC用GDI+动感歌词的制作

源代码:http://download.csdn.net/detail/nuptboyzhb/4219669 源代码: 1. 插入一个对话框的资源,删除默认控件,并为对话框创建一个类,命名为ClyricDlg; 2. 在对话框的头文件中添加GDI+相...

长平狐
2012/10/08
250
0

没有更多内容

加载失败,请刷新页面

加载更多

a标签点击浏览器下载图片,不打开

网上好多给a标签加download属性的,但都不好使。 <!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Auth......

S三少S
7分钟前
14
0
搭建私有maven仓库并在项目中使用

这是一篇写给女朋友看的教程...前方高能,注意避让~ 1.私有maven仓库的搭建 搭建环境为阿里云ESC服务器,CentOS.确保服务器已经安装Jdk。然后我要手把手教你安装和启动nexus。 Step1:新建一个...

liululee
10分钟前
1
0
js 写文件

//写文件function doSave(value, type, name) {    var blob;    if (typeof window.Blob == "function") {        blob = new Blob([value], {type: type});    }......

重城重楼
19分钟前
1
0
Ubuntu and Apache 搭建 Let's Encrypt SSL Https

本文参考来着来自https://www.howtoing.com/install-free-lets-encrypt-ssl-certificate-for-apache-on-debian-and-ubuntu 感谢作者的分享 本事例环境介绍 ubuntu (Version 16.04.1 LTS) ubu......

罗培海
23分钟前
16
0
如何优雅的使用RabbitMQ

目录 RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具。消息队列的使用场景大概有3种: 1、系统集成,分布式系统的...

编程SHA
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部