zoukankan      html  css  js  c++  java
  • WinAPI: ExtCreateRegion 区域变换

    相似函数: 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
    
  • 相关阅读:
    关于fragment点击能穿透问题
    Eclipse的PHP插件PHPEclipse安装和使用
    Eclipse的PHP插件PHPEclipse安装和使用
    解决在极光推送的时候会出现一个 JPush提示:缺少统计代码
    解决在极光推送的时候会出现一个 JPush提示:缺少统计代码
    Spring学习总结(17)——Spring AOP权限管理
    Gradle学习总结——抓重点学Gradle
    WebService学习总结(6)——WebService常用接口
    Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源
    Spring学习总结(15)——Spring AOP 拦截器的基本实现
  • 原文地址:https://www.cnblogs.com/del/p/1212534.html
Copyright © 2011-2022 走看看