文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 430
阅读 6
收藏 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

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
实战开发:新手小白如何用C++制作经典网游DNF

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

stone15165
05/05
0
0
OSG3.2+Qt5.2.1+VS2012+OSGEarth 2.5编译问题记录

问题1:CMake Error at D:/Qt/Qt5.2.1/5.2.1/msvc201264opengl/lib/cmake/Qt5Gui/Qt5GuiConfigExtras.cmake:16 (message): Failed to find "glu32" in "" with CMAKECXXLIBRARY_ARCHITECTURE ......

天蚕宝衣
2016/11/21
17
0
在C++Builder中使用GDI+的流程

在C++Builder中使用GDI+的流程: 1、 GDI+主要是通过gdiplus.dll进行调用,而BCB没有直接提供与gdiplus.dll对应的静态链接库,所以需要我们自己建立。如果在自己的计算机没有找到文件gdiplus...

hack_tian
04/11
0
0
MFC程序开机启动,图片无法加载,显示一片空白

开机时程序无法加载相应的图片,在应该有图片的地方显示为背景色。 程序使用GDI+加载图片,使用相对路径。当双击打开时程序显示正常,而当程序使用注册表添加到开机启动项时,程序开机时的主体部...

饕餮之怒
2013/05/18
607
1
C# WinForm开发系列 - GDI+

UI(User Interface)编程在整个项目开发过程中是个颇为重要的环节,任何好的解决方案若没有良好的用户界面呈现给最终用户,那么就算包含了最先进的技术也不能算是好程序。UI编程体现在两个方...

长征2号
2017/11/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式块存储的引擎如何设计?

前言: 目前在万兆网络和SSD,包括NVMe SSD 都已经非常普及。随着硬件的速度越来越快,性能的瓶颈会从硬件转移到软件。尤其对于存储引擎来说,性能至关重要。 先来看一下我们会对数据存储引擎...

Java干货分享
26分钟前
1
0
docker(五):docker-compose.yml 配置

docker-compose.yml常用命令 image 指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。 示例: image: java build 指定Dockerfile文件的路径。可以是一个路径,例如...

开心的哈士奇
31分钟前
1
0
Tale的升级真是惊心动魄,吓死人

精心动魄的博客升级计划,Tale 这几天在筹划将分散在其他几个地方的博客统一到这里来,也就留意了tale的更新,发现出现了2.0.1版本; 因此动了升级的念头,唉! 高估了个人开放着的系统规划能...

硅步积千里
41分钟前
1
0
tcc分布式事物

因为最近公司的新退货系统用到了spring cloud。所以会涉及到一些分布式事物。 所以需要先了解一下,分布式事物。 shuaiqiyu / hmily 高性能异步分布式事务TCC框架 谭纳 / spring-cloud-rest-...

miaojiangmin
42分钟前
1
0
20181016 上课截图

小丑鱼00
47分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部