文档章节

再学 GDI+[59]: 路径 - TGPGraphicsPathIterator

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 430
阅读 27
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

通过路径的辅助类 TGPGraphicsPathIterator , 可以获得更多路径数据和控制能力.

本例效果图:



代码文件:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses GDIPOBJ, GDIPAPI;

var
  path: TGPGraphicsPath;

procedure TForm1.FormCreate(Sender: TObject);
var
  pt1, pt2: TPoint;
begin
  Button1.Caption := '查看路径基本数据';
  Button2.Caption := '重绘路径中的子路径';

  pt1 := Point(30, 20);
  pt2 := Point(150, 120);

  {建立路径, 并添加四个子图形}
  path := TGPGraphicsPath.Create;
  path.StartFigure;
  path.AddRectangle(MakeRect(Rect(pt1, pt2)));
  path.CloseFigure;

  path.StartFigure;
  path.AddEllipse(MakeRect(Rect(pt1, pt2)));
  path.CloseFigure;

  path.StartFigure;
  path.AddLine(pt1.X, pt1.Y, pt2.X, pt2.Y);
  path.CloseFigure;

  path.StartFigure;
  path.AddLine(pt1.X, pt2.Y, pt2.X, pt1.Y);
  path.CloseFigure;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  path.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  p := TGPPen.Create(aclSilver, 2);
  g.DrawPath(p, path);
  p.Free;
  g.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  PathIterator: TGPGraphicsPathIterator;
  str: string;
begin
  PathIterator := TGPGraphicsPathIterator.Create(path);
  str := str + Format('路径中的总点数: %d', [PathIterator.GetCount]);
  str := str + Format(sLineBreak + '路径中的子路径数: %d', [PathIterator.GetSubpathCount]);
  str := str + Format(sLineBreak + '路径中是否包含曲线: %s', [BoolToStr(PathIterator.HasCurve, True)]);
  ShowMessage(str);
  PathIterator.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
  ColorArr: array[0..3] of TGPColor = (aclRed, aclGreen, aclBlue, aclYellow);
var
  PathIterator: TGPGraphicsPathIterator;
  PathSection: TGPGraphicsPath;
  bool: LongBool;
  g: TGPGraphics;
  p: TGPPen;
  i: Integer;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  p := TGPPen.Create(aclRed, 2);
  PathIterator := TGPGraphicsPathIterator.Create(path);

  PathIterator.Rewind; {到路径起始点}
  for i := 0 to PathIterator.GetSubpathCount - 1 do
  begin
    PathSection := TGPGraphicsPath.Create;
    PathIterator.NextSubpath(PathSection, bool);
    p.SetColor(ColorArr[i]);
    g.DrawPath(p, PathSection);
    PathSection.Free;
  end;

  PathIterator.Free;
  p.Free;
  g.Free;
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 198
  ClientWidth = 181
  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 Button1: TButton
    Left = 24
    Top = 134
    Width = 137
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 24
    Top = 165
    Width = 137
    Height = 25
    Caption = 'Button2'
    TabOrder = 1
    OnClick = Button2Click
  end
end

 
 
 
 
 

 

 

  

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

涂孟超
粉丝 13
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
加载中

评论(0)

MFC CListctr显示缩略图

我们知道通过CImageList可以让listctr显示出图片,但是添加的图片大小必须和要CImageList 创建的图片大小一致,才能显示出来。最近遇到一个需求,需要把很多大小不一的jpeg图片通过列表框来显...

osc_qhb83isy
2019/06/07
0
0
【C++自绘控件】如何用GDI+来显示图片

在我们制作一个应用软件的时候往往需要在窗口或控件中添加背景图。而图片不仅有BMP格式的,还有JPEG、PNG、TIFF、GIF等其它的格式。那么如何用jpg格式的图片来当背景呢? 这里用到了GDI+,顾...

riskyer的A.P.I.
2013/11/14
0
0
实战开发:新手小白如何用C++制作经典网游DNF

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

stone15165
2018/05/05
0
0
【VC++技术杂谈007】使用GDI+进行图片格式转换

  本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp、jpg、png。 1.加载GDI+库   GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API。为了使用GDI+,需要...

依旧淡然
2015/04/21
0
0
GdiPlus 一个给 Delphi 提供的新的 GDI+ 接口很好用!

尽管 GDI+ 已经有近 10 年的历史(随 Win2000 推出), 尽管 DirectX 如日中天, 但在 Windows 7 之前的版本下进行 2D 绘图还是离不开它, 微软也没有停止对它的升级, 随 Vista 的 GDI 版本是 1....

osc_odfa308v
2019/08/28
2
0

没有更多内容

加载失败,请刷新页面

加载更多

如何将新的本地分支推送到远程Git存储库并进行跟踪?

问题: I want to be able to do the following: 我希望能够做到以下几点: Create a local branch based on some other (remote or local) branch (via git branch or git checkout -b ) 基......

技术盛宴
31分钟前
14
0
Python笔记:记pandas中几个好用的函数

pandas是python数据分析常用的库之一!从数据加载到预处理,从数据分析到可视化,pandas提供了一站式服务。而以下这几个聚合统计函数,更是好用! 本文主要讲解pandas中的7个聚合统计相关函数...

tengyulong
59分钟前
23
0
使用“ let”和“ var”有什么区别? - What's the difference between using “let” and “var”?

问题: ECMAScript 6 introduced the let statement . ECMAScript 6引入了let语句 。 I've heard it that it's described as a "local" variable, but I'm still not quite sure how it beh......

javail
今天
17
0
如何将文件重置或还原到特定版本? - How can I reset or revert a file to a specific revision?

问题: I have made some changes to a file which has been committed a few times as part of a group of files, but now want to reset/revert the changes on it back to a previous ver......

fyin1314
今天
24
0
OSChina 周五乱弹 —— 头发和不要头发,你总要选一个

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《雾 缀じた街 ふたつのかげ》- Porkkana 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
55
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部