文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 种族不同,禁止交往

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《苏菲小姐》- 鱼果 《苏菲小姐》- 鱼果 手机党少年们想听歌,请使劲儿戳(这里) @貓夏:下大雨 正是睡觉的好时候 临睡前...

小小编辑
今天
199
6
Python 搭建简单服务器

Python动态服务器网页(需要使用WSGI接口),基本实现步骤如下: 1.等待客户端的链接,服务器会收到一个http协议的请求数据报 2.利用正则表达式对这个请求数据报进行解析(请求方式、提取出文...

代码打碟手
今天
1
0
Confluence 6 删除垃圾内容

属性(profile)垃圾 属性垃圾的定义为,一个垃圾用户在 Confluence 创建了用户,但是这个用户在自己的属性页面中添加了垃圾 URL。 如果你有很多垃圾用户在你的系统中创建了属性,你可以使用...

honeymose
今天
0
0
qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部