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).

时间: 2024-08-24 06:26:48

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

图片轮换特效

1.图片自动依次轮换,每轮换到一张图片,下面对应的小图标出现红色边框,并显示对应的图片名称 2.鼠标放到大图片上面的时,图片停止轮换,一直显示当前图片:鼠标移开后图片继续轮换 3.鼠标移到小图标上时,大图片区域会显示对应的大图:鼠标移开则从当前图片开始继续轮换 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>带小图标

GDI+编程小结

GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息. GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows图形图像程序开发的首选. 一.              GDI+的特点和新增功能 GDI+与GDI一样,都具有设备无关性.应用程序的程序员可利用GDI+这样

HTML 导航框架 (使用 Frame )

文章出处  :  http://blog.sina.com.cn/s/blog_6f6d07f80100oqlt.html  (本文转自此博客) 在浏览网页时,我们经常会看到一个导航条,当点击导航条上的项目时,相应网页会在显示区域变换显示.首先准备一个主界面文件main.htm,将其划分成两块区域index和content. <html> <frameset cols="120,*"> <frame name="index" src=&

HOOK - d3dx9库函数

原文地址:http://blog.csdn.net/weiwangchao_/article/details/7037506 以下为我整理的d3dx9库函数简略版,以后除了msdn外,存档备用: D3DXCOLOR* D3DXColorAdd   //两个颜色的组合值D3DXCOLOR* WINAPI D3DXColorAdjustContrast( //调整颜色对比度D3DXCOLOR *pOut,const D3DXCOLOR *pC,FLOAT c);D3DXCOLOR* WINAPI D

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

前言: 最近研究了box2dweb, 觉得自己编写Html5版台球游戏的时机已然成熟. 这也算是圆自己的一个愿望, 一个梦想. 承接该序列的相关博文: • 台球游戏核心算法和AI(1) 同时结合html5的学习笔记: • box2dweb 学习笔记--sample讲解  这篇文章, 具体讲解台球游戏的box2d模型抽象, 并给出一个初步版本. 演示: 台球游戏的雏形如下所示: 该台球游戏, 改编自box2dweb的demo程序, 可用鼠标拖动球来移动. 代码的下载链接: http://pan.b

d3dx9库函数

这几天参考了csdn上大坡先生()整理的d3dx9的库函数,我做了一些机械的事情.就算过年练打字了.以下为我整理的d3dx9库函数简略版,以后除了msdn外,存档备用: D3DXCOLOR* D3DXColorAdd   //两个颜色的组合值D3DXCOLOR* WINAPI D3DXColorAdjustContrast( //调整颜色对比度D3DXCOLOR *pOut,const D3DXCOLOR *pC,FLOAT c);D3DXCOLOR* WINAPI D3DXColorAdjus

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

1 * ball.hdev: Inspection of Ball Bonding 2 * 球接合检查 Comment Time:2014/9/10 3 *核心思想:1.白色区域用作自动ROI,黑色区域是目标 4 * 2.Opening_circle:圆形开算子是关键 5 *关闭窗口刷新,关闭窗口,打开窗口[728,512] 6 dev_update_window ('off') 7 dev_close_window () 8 dev_open_window (0, 0, 728, 512, '

特殊的图片轮换特效

特殊的图片轮换特效 一.实现效果 如上图: 1.图片自动依次轮换,每轮换到一张图片,下面对应的小图标出现红色边框,并显示对应的图片名称 2.鼠标放到大图片上面的时,图片停止轮换,一直显示当前图片:鼠标移开后图片继续轮换 3.鼠标移到小图标上时,大图片区域会显示对应的大图:鼠标移开则从当前图片开始继续轮换 二.代码 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset=&quo

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

基于YoloV3的实时摄像头记牌器 最终效果 数据准备 数据获取 从摄像头拍摄各种牌型的视频各20秒,不采用人工打标签,而是通过识别出牌的边缘,将牌经过仿射变换矫正,根据牌的实际宽高以及标注位置的实际宽高得到标注位置.通过随机生成背景图片,并且将牌在背景中随机旋转和平移,去掉标注部分被遮挡的生成图片,同时将label也做同样的变换,完成数据集的获取. 先定义好将识别到的卡片zoom到我们希望的宽高: cardW=57#实际宽度 cardH=87#实际高度 cornerXmin=2 #牌的号码距左