WinAPI: ExtCreateRegion - 区域变换
转载: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 - 区域变换的更多相关文章
- HTML 导航框架 (使用 Frame )
文章出处 : http://blog.sina.com.cn/s/blog_6f6d07f80100oqlt.html (本文转自此博客) 在浏览网页时,我们经常会看到一个导航条,当点击导航条上 ...
- Halcon 10.0 Sample:完整性检查(圆形)
* ball.hdev: Inspection of Ball Bonding * 球接合检查 Comment Time:// *核心思想:.白色区域用作自动ROI,黑色区域是目标 * .Openin ...
- 台球游戏的核心算法和AI(2)
前言: 最近研究了box2dweb, 觉得自己编写Html5版台球游戏的时机已然成熟. 这也算是圆自己的一个愿望, 一个梦想. 承接该序列的相关博文: • 台球游戏核心算法和AI(1) 同时结合htm ...
- GDI+编程说明及小结
原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...
- 目标检测之R-CNN系列
Object Detection,在给定的图像中,找到目标图像的位置,并标注出来. 或者是,图像中有那些目标,目标的位置在那.这个目标,是限定在数据集中包含的目标种类,比如数据集中有两种目标:狗,猫. ...
- GDI+编程小结
GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负 ...
- d3dx9库函数
这几天参考了csdn上大坡先生()整理的d3dx9的库函数,我做了一些机械的事情.就算过年练打字了.以下为我整理的d3dx9库函数简略版,以后除了msdn外,存档备用: D3DXCOLOR* D3DX ...
- 物体检测丨从R-CNN到Mask R-CNN
这篇blog是我刚入目标检测方向,导师发给我的文献导读,深入浅出总结了object detection two-stage流派Faster R-CNN的发展史,读起来非常有趣.我一直想翻译这篇博客,在 ...
- [视觉] 基于YoloV3的实时摄像头记牌器
基于YoloV3的实时摄像头记牌器 github:https://github.com/aoru45/cards_recognition_recorder_pytorch 最终效果 数据准备 数据获取 ...
随机推荐
- AngularJS开发指南4:指令的详解
指令是我们用来扩展浏览器能力的技术之一.在DOM编译期间,和HTML元素关联着的指令会被检测到,并且被执行.这使得指令可以为DOM指定行为,或者改变它. AngularJS有一套完整的.可扩展的.用来 ...
- JS面向对象高级特性
本篇是通过学习视频<一头扎进javascirpt高级篇>整理的一些相关知识,大致包括下面几个方面: 1 对象的创建方法 2 对象的对象属性.私有属性.类属性 3 对象的对象方法.私有方法. ...
- java和linux的编码
最近要使用中科院计算所的关键词工具NLPIR,用java调用,在windows下测试后放到linux下跑,就发现会有乱码. windows下默认是GBK,linux下是utf-8,因此在意料之中(尽管 ...
- zabbix_监控_进程
一.根据进程名称监控 1.创建Item(只能通过进程名.用户过滤进程) http://www.2cto.com/os/201405/302249.html http://www.ithao1 ...
- codevs 1835 魔法猪学院 A*寻k短路做了一个月卡死在spfa那了/(ㄒoㄒ)/~~
SPFA时点出队后一定要把在队内的标记置为false!SPFA时点出队后一定要把在队内的标记置为false!SPFA时点出队后一定要把在队内的标记置为false! 我因为这个卡了一个月大家信吗?测得时 ...
- 扩展KMP
刘雅琼论文 http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 论文讲的非常详细. 给定母串S,子串T,n=strlen(S),m=st ...
- href="javascript:void(0)"
javascript:是伪协议,表示url的内容通过javascript执行.void(0)表示不作任何操作,这样会防止链接跳转到其他页面.这么做往往是为了保留链接的样式,但不让链接执行实际操作,具体 ...
- 提示用户一直输入数字(默认为正整数),当用户输入end的时候显示当前输入数字中的最大值。
string input = ""; ; while (input != "end") { Console.WriteLine("请输入一个正整数,输 ...
- Shell编程检测监控mysql的CPU占用率
shell编程很强大! 网站访问量大的时候mysql的压力就比较大,当mysql的CPU利用率超过300%的时候就不能提供服务了,近乎卡死状态,这时候最好的方法就是重启mysql服务.由于这种事具有不 ...
- Centos更换yum库镜像
首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...