博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinAPI: ExtCreateRegion - 区域变换
阅读量:6003 次
发布时间:2019-06-20

本文共 4197 字,大约阅读时间需要 13 分钟。

  hot3.png

相似函数: SetWorldTransform

本例效果图:
26153909_QXC2.gif

代码文件:

unit Unit1;interfaceuses  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  endend

转载于:https://my.oschina.net/hermer/blog/320767

你可能感兴趣的文章
011 递归
查看>>
南京建邺、秦淮等7个区公布校外培训机构白名单
查看>>
python 全局变量与局部变量
查看>>
011 pandas的常见操作
查看>>
WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化
查看>>
Linux 安装 Docker
查看>>
Python3下基于bs4和sqlalchemy的爬虫实现
查看>>
centos7 在docker swarm中运行Jenkins,利用gitlab的webhook触发自动部署脚本
查看>>
Idea下Python开发平台的搭建
查看>>
token令牌和jwt
查看>>
I2S接口介绍
查看>>
(原創) 如何設計一個數位相框? (SOC) (Quartus II) (SOPC Builder) (Nios II) (TRDB-LTM) (DE2-70)...
查看>>
/etc/profile文件内容
查看>>
量词 匹配优先与忽略优先
查看>>
一页纸IT项目管理:大道至简的实用管理沟通工具
查看>>
汽车知识:车内异味的清除方法
查看>>
IE6 7下绝对定位引发浮动元素神秘消失
查看>>
android - ADT本地配置、sdk配置
查看>>
I.MX6 dhcpcd 需要指定网卡
查看>>
SGU 105 Div 3
查看>>