文档章节

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
深圳
程序员
vs 2005 添加GDI配置

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

种地瓜
2015/12/08
85
0
GDI+里面的问题。。。。。。。。。。

error C2248: “Gdiplus::Bitmap::Bitmap”: 无法访问 private 成员(在“Gdiplus::Bitmap”类中声明) 1> c:program filesmicrosoft sdkswindowsv7.0aincludegdiplusheaders.h(630) : 参见“G......

xxdd
2013/10/24
60
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
GDI+图像处理学习笔记——改变图像的透明度

GDI+是WindowsXp和windows Server 2003中的一个子系统,主要用于处理系统的绘制消息。GDI+是GDI的扩展,其继承了GDI的有点并在其基础上进行了改进,包括增加了一些GDI无法绘制的图形函数,同...

晨曦之光
2012/05/23
491
0
MFC用GDI+动感歌词的制作

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

长平狐
2012/10/08
236
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring之IOC和AOP学习摘要

一、IOC(Inversion of Control)或者依赖注入(Dependency Injection) 1、底层实现原理:反射 2、三大核心接口: BeanFactory:简单容器系列,只是实现了容器最基本的功能。 ApplicationC...

狠一点
27分钟前
4
0
缓存架构SpringBoot集成Curator实现zookeeper分布式锁

一、分布式锁简介 1、什么是锁 在单机环境下,当存在多个线程可以同时改变某个共享变量时,就需要同步来实现该功能,使其线程安全。 而同步就是通过锁来实现的。锁保证了同一时刻只有一个线程...

架构师springboot
29分钟前
1
0
11《Java核心技术》之Java提供了哪些IO方式? NIO如何实现多路复用?

一、提出问题 IO 一直是软件开发中的核心部分之一,伴随着海量数据增长和分布式系统的发展,IO 扩展能力愈发重要。幸运的是,Java 平台 IO 机制经过不断完善,虽然在某些方面仍有不足,但已经...

飞鱼说编程
36分钟前
4
0
简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。 War是...

linuxprobe16
36分钟前
1
0
55:Mysql用户管理|常用sql语句|mysql数据库备份恢复

1、Mysql用户管理; 场景,为了安全,新建的站点,创建新的用户,或者给已有用户授权,对某个库或者某个表有权限; 语法: grant all on *.* to 'user'@'127.0.0.1' identified by 'password'; g...

芬野de博客
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部