转载:http://www.cnblogs.com/del/archive/2008/06/03/1212534.html

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

TXForm 结构定义在 Windows 单元的 12205 - 12213 行(Delphi 2007).

WinAPI: ExtCreateRegion - 区域变换的更多相关文章

  1. HTML 导航框架 (使用 Frame )

    文章出处  :  http://blog.sina.com.cn/s/blog_6f6d07f80100oqlt.html  (本文转自此博客) 在浏览网页时,我们经常会看到一个导航条,当点击导航条上 ...

  2. Halcon 10.0 Sample:完整性检查(圆形)

    * ball.hdev: Inspection of Ball Bonding * 球接合检查 Comment Time:// *核心思想:.白色区域用作自动ROI,黑色区域是目标 * .Openin ...

  3. 台球游戏的核心算法和AI(2)

    前言: 最近研究了box2dweb, 觉得自己编写Html5版台球游戏的时机已然成熟. 这也算是圆自己的一个愿望, 一个梦想. 承接该序列的相关博文: • 台球游戏核心算法和AI(1) 同时结合htm ...

  4. GDI+编程说明及小结

    原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...

  5. 目标检测之R-CNN系列

    Object Detection,在给定的图像中,找到目标图像的位置,并标注出来. 或者是,图像中有那些目标,目标的位置在那.这个目标,是限定在数据集中包含的目标种类,比如数据集中有两种目标:狗,猫. ...

  6. GDI+编程小结

    GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负 ...

  7. d3dx9库函数

    这几天参考了csdn上大坡先生()整理的d3dx9的库函数,我做了一些机械的事情.就算过年练打字了.以下为我整理的d3dx9库函数简略版,以后除了msdn外,存档备用: D3DXCOLOR* D3DX ...

  8. 物体检测丨从R-CNN到Mask R-CNN

    这篇blog是我刚入目标检测方向,导师发给我的文献导读,深入浅出总结了object detection two-stage流派Faster R-CNN的发展史,读起来非常有趣.我一直想翻译这篇博客,在 ...

  9. [视觉] 基于YoloV3的实时摄像头记牌器

    基于YoloV3的实时摄像头记牌器 github:https://github.com/aoru45/cards_recognition_recorder_pytorch 最终效果 数据准备 数据获取 ...

随机推荐

  1. [USACO2002][poj1944]Fiber Communications(枚举)

    Fiber Communications Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3804   Accepted: 1 ...

  2. 使用TinkPHP实现品字形布局

    一.后台管理模版 后台管理模版通常使用frameset/iframe来布局.例如: <!DOCTYPE html> <html> <head> <title& ...

  3. Python学习日记

    江林楠学习了一下午后给大家呈现的20分钟速成Python—— 一些基本的语法:1.python无变量声明 直接a = []即可.2.python为对齐语言,用制表符表示语句块的嵌套.3.python语 ...

  4. Codeforces Round #379 (Div. 2) D. Anton and Chess 模拟

    题目链接: http://codeforces.com/contest/734/problem/D D. Anton and Chess time limit per test4 secondsmem ...

  5. Xamarin.Forms入门学习路线

    Xamarin 介绍 Xamarin是一套跨平台解决方案,目的是使用C#语言创造原生的iOS,Android,Mac和Windows应用. Xamarin的三个优势: Xamarin App拥有原生A ...

  6. NODE学习:利用nodeJS去抓网页的信息

    1:引用模块"http" (执行命令node app.js "http://www.baidu.com") //app.jsvar http = require ...

  7. python 学习笔记3(循环方式;list初始化;循环对象/生成器/表推导;函数对象;异常处理)

    ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 16. 循环方式笔记: 1)range(0, 8, 2)   #(上限,下限,步长)  可以实现对元素或者下标的 ...

  8. USACO 3.3 fence 欧拉回路

    题意:求给定图的欧拉回路(每条边只走一次) 若欧拉回路存在,图中只可能有0个or2个奇数度的点. 求解时,若有奇数度的点,则必须从该点开始.否则可以从任一点开始 求解过程:dfs //主程序部分 # ...

  9. Java JDBC下执行SQL的不同方式、参数化预编译防御

    相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...

  10. JAVA-封装

    1.什么是封装? 顾名思义,封装就是装起来,圈起来的意思,用于类与对象中来讲,就是在一个类中把对象拥有的属性和隐藏信息(条件)进行封装,不允许外部程序直接访问,而必须要通过该类提供的方法来实现对隐藏信 ...