zoukankan      html  css  js  c++  java
  • 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).

  • 相关阅读:
    有哪些带汉字的 LOGO 或者图标设计得很出色?
    从初级晋级高级UI设计师学习路线+全套视频
    UI常见面试题-整体素养篇
    PS精修电影胶片调色特效[附素材及方法]
    全链路UI、UE设计学习路线+视频教程完整版
    网页设计之栅格系统及应用
    移动端APP产品设计结构及专业术语
    九十分钟极速入门Linux——Linux Guide for Developments 学习笔记
    PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
    数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/4952281.html
Copyright © 2011-2022 走看看