文档章节

再学 GDI+[56]: 路径 - Warp

涂孟超
 涂孟超
发布于 2014/09/26 15:30
字数 624
阅读 13
收藏 0
通过路径的 Warp 方法可以让路径在一个范围内(四个点决定的范围)变换;

第一个参数可以是 3 个点或 4 个点的数组, 如果是 3 个的数组, 那么第 4 个点将自动跟随一个平行四边形;

第二个参数用来指定点数组的个数, 本例就是通过这个参数控制了点的个数;

第三个参数是一个矩形, 这个矩形应该是路径的外接矩形, 之后的参数都是可选的;

第四个参数也是一个矩阵变换, 因由专门的 例子 , 这里没有尝试;

第五个参数是 TWarpMode(WarpModePerspective, WarpModeBilinear) , 默认前者;

第六个参数可以指定 Flatten 变换, 前面有 例子 , 这里也没有尝试.

本例效果图:



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses GDIPOBJ, GDIPAPI;

var
  ptfs: array[0..3] of TGPPointF;
  ptCount: Integer = 4;
  pti: Integer;
  R: TRect;
  flag: Boolean;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CheckBox1.Caption := '只用 3 个点控制';
  R := Rect(20, 20, ClientWidth-20, ClientHeight - 40);
  ptfs[0] := MakePoint(R.Left*1.0, R.Top);
  ptfs[1] := MakePoint(R.Right*1.0, R.Top);
  ptfs[2] := MakePoint(R.Left*1.0, R.Bottom);
  ptfs[3] := MakePoint(R.Right*1.0, R.Bottom);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  b: TGPBrush;
  path: TGPGraphicsPath;
  fontFamily: TGPFontFamily;
  StringFormat: TGPStringFormat;
  rectf: TGPRectF;
  i: Integer;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  p := TGPPen.Create(aclRed, 1);
  b := TGPHatchBrush.Create(HatchStyleShingle, aclDarkCyan);

  path := TGPGraphicsPath.Create;
  path.AddEllipse(MakeRect(R));
  fontFamily := TGPFontFamily.Create('Arial Black');

  StringFormat := TGPStringFormat.Create;
  StringFormat.SetAlignment(StringAlignmentCenter);
  StringFormat.SetLineAlignment(StringAlignmentCenter);

  path.GetBounds(rectf);
  path.AddString('Delphi', -1, fontFamily, FontStyleRegular, 48, rectf, StringFormat);

  path.Warp(PGPPointF(@ptfs), Length(ptfs), rectf);
  g.FillPath(b, path);

  for i := 0 to ptCount - 1 do
    g.DrawRectangle(p, MakeRect(ptfs[i].X-3, ptfs[i].Y-3, 6, 6));

  StringFormat.Free;
  fontFamily.Free;
  path.Free;
  b.Free;
  p.Free;
  g.Free;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  ptCount := 4;
  if CheckBox1.Checked then ptCount := 3;
  Repaint;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
begin
  for i := 0 to 3 do
    if PtInRect(Bounds(Trunc(ptfs[i].X-3), Trunc(ptfs[i].Y-3), 6, 6), Point(X, Y)) then
    begin
      pti := i;
      flag := True;
      Exit;
    end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if flag then
  begin
    ptfs[pti].X := X;
    ptfs[pti].Y := Y;
    Repaint;
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  flag := False;
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 220
  ClientWidth = 264
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnMouseDown = FormMouseDown
  OnMouseMove = FormMouseMove
  OnMouseUp = FormMouseUp
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
  object CheckBox1: TCheckBox
    Left = 151
    Top = 195
    Width = 129
    Height = 17
    Caption = 'CheckBox1'
    TabOrder = 0
    OnClick = CheckBox1Click
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/06/20/1227061.html

涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
CUDA学习(五十六)

块内合作组的使用: 在本节中,通过一些使用示例说明了协作组功能。 发现模式: 通常开发人员需要使用当前活动的一组线程。 没有对现有的线程进行假设,而是开发人员使用碰巧存在的线程。 这...

night李
2018/02/22
0
0
CUDA学习(八十七)

独立的线程调度: Volta体系结构在变形中的线程之间引入了独立线程调度功能,可实现先前不可用的内部变形同步模式,并在移植CPU代码时简化代码更改。 但是,如果开发人员对以前的硬件体系结构...

night李
2018/02/24
0
0
CUDA学习(三十三)

最大化指令吞吐量: 为了最大化指令吞吐量,应用程序应 尽量减少低吞吐量的算术指令的使用; 这包括在不影响最终结果的情况下交易的速度精度,例如使用内部函数而不是常规函数(内部函数在内部...

night李
2018/02/11
0
0
实战开发:新手小白如何用C++制作经典网游DNF

十年前,那时候的网吧还不叫网咖,那时候没有王者荣耀也没有英雄联盟,那时候梦幻西游刚推出珍宝阁系统,那时候巫妖王的灵魂还封闭在冰封王座。 寻仙、穿越火线、征途、天龙八部……同时在线...

stone15165
2018/05/05
0
0
Python生成pdf问题解决总结

1,生成pdf时的中文及自动换行问题: pdfmetrics.registerFont(TTFont('song', settings.MEDIA_ROOT+'/file/SURSONG.TTF'))from reportlab.lib import fontsfrom django.template import Con......

ohailong
2014/10/23
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
9
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部