文档章节

再学 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
626
1
VC 6.0 配置和使用gdi+

GDI+ GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,W...

junwong
2012/03/23
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

MYSQL事务处理

INNODB 事务里,所有表引擎必须为INNODB,在非实务表上操作,不会警告,不会报错,但没有效果

关元
26分钟前
1
0
cmake 编译脚本

#!/bin/sh test -d build || mkdir -p build cd build cmake .. make

shzwork
43分钟前
2
0
从零开始实现Vue简单的Toast插件

概述: 在前端项目中,有时会需要通知、提示一些信息给用户,尤其是在后台系统中,操作的正确与否,都需要给与用户一些信息。 1. 实例 在Vue组件的methods内,调用如下代码 `this``.$toast({...

前端小攻略
48分钟前
1
0
yaf和yaconf

pecl install yafpecl install yaconf [yaf] yaf.environ = dev yaf.use_spl_autoload = On yaf.use_namespace = 1 [yaconf] yaconf.directory = /data/wwwroot/yaconf......

果树啊
48分钟前
0
0
day01:shell基础(shell基础、alias及重定向)

1、shell基础介绍: shell是一个命令解释器,用于用户与机器的交互: 也支持特定的语法(逻辑判断,循环): 每个用户都有自己特定的shell:Centos7的shell是bash(bourne agin shell): shel...

芬野de博客
51分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部