• 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
    
  • 相关阅读:
    关于android中两种service的编写简单总结
    To learn list
    android中如何在系统启动的时候启动自己的service
    service的生命周期以及两种service的差异
    Intent的简单概述
    关于startactivity初始化activity的过程以及activity和window以及view的关系
    android activity生命周期的一张经典图片
    关于Android进程的启动和消亡
    Java基础学习总结(73)——Java最新面试题汇总
    Beetl学习总结(4)——Web集成
  • 原文地址:https://www.cnblogs.com/del/p/1212534.html
Copyright © 2020-2023  润新知