AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
DelphiXE3 [FMX] パス図形描画(1) 2014/05/23
 
パス図形描画(DrawPath)は、キャンバス(Canvas)に 指定したパス(経路)の連続線(円弧や曲線も可能、複数指定も可能)を描画する機能です。
 
以下、ヘルプより
TCanvas.
DrawPath
procedure DrawPath(const APath: TPathData;
 const AOpacity: Single);
procedure DrawPath(const APath: TPathData;
 const AOpacity: Single;
 const ABrush: TStrokeBrush);
path を、現在の TCanvas 上に描画します。
 
TPathData を現在の Stroke で描画するには、DrawPath を TCanvas の子孫で実装する必要があります。
 
APath パラメータは、描画される TPathData を示します。
 
AOpacity パラメータは、Stroke 色の透明度を示します。
 
APath が空の場合、DrawPath は何も行いません。DrawPath は、この場合、例外を発生させません。
 
 メモ:DrawPath を呼び出す前に、
    APath が作成されていることを確認してください。
 
描画ペンをカスタマイズするには、Strocke、StrokeThickness、StrokeCap、StrokeDash、および StrokeJoin の各プロパティを使用します。
 
[Shapes]内のペイントボックス(PaintBox)を配置し、ClipChildernプロパティを True にしておきます。uses節に「UIConsts」を追記します。

OnPaintイベントハンドラを下記のようにしてみます。
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
 path : TPathData ;
begin
 path := TPathData.Create ;
 path.Data := 'M10,10 100,10 100,100 10,100 10,10';
 
 with Canvas do begin
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkSolid ;
  Stroke.Color := claBlue ;
  DrawPath(path, 1.0);
 end;
 
 path.Free ;
end;
保存・ビルド(コンパイル)・実行をすると下図のようになります。

5点(10,10)〜(100,10)〜(100,100)〜(10,100)〜(10,10)を結ぶ、透過率 1.0 (完全不透明状態)で青色のパス図形=四角形を描画します。こういった手法で前述の多角形描画(DrawPolygon)と同じような描画を行う事が出来ます。
 
パス図形のパスデータ(TPathData)については、既に、
  ・[FMX] パス図形(Path)
  ・パスラベル(PathLabel)
  ・パス移動アニメーション(PathAnimation)
などで記述していますので、ここではパスデータ文字列についての説明は省略します。
 
パス図形は一度に複数の図形を作図する事も出来ます。
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
 path : TPathData ;
begin
 path := TPathData.Create ;
 path.Data := 'M10,10 100,10 100,100 10,100 10,10';
 path.Data := path.Data + ' M60,60 140,60 100,140 Z';
 with Canvas do begin
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkSolid ;
  Stroke.Color := claBlue ;
  DrawPath(path, 1.0);
 end;
 path.Free ;
end;
という風にパスデータ文字列を続けて指定すれば、下図のように作図する事が可能です。

 
パス図形は、直前までに指定した Strokeブラシの状態で描画します。
Stroke.Kind でブラシの種類(色、ビットマップ、グラデーション)、
Stroke.Thickness で線幅、
Stroke.Dash で線種、
Stroke.Cap で線端状態、
Stroke.Join で結合部状態、
を指定します。
 
例えば下記のようにすると、
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
 path : TPathData ;
begin
 path := TPathData.Create ;
 path.Data := 'M10,10 100,10 100,100 10,100 10,10';
 path.Data := path.Data + ' M60,60 140,60 100,140 Z';
 with Canvas do begin
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkGradient ;
  Stroke.Gradient.Color := claRed ;
  Stroke.Gradient.Color1 := claYellow ;
  Stroke.Thickness := 10 ;
  Stroke.Dash := TStrokeDash.sdDash ;
  Stroke.Cap := TStrokeCap.scRound ;
  Stroke.Join := TStrokeJoin.sjBevel ;
  DrawPath(path, 1.0);
 end;
 path.Free ;
end;
下図のように描画されます。

 
これだと結合部状態 Join がよく分かりませんので、
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
 path : TPathData ;
begin
 path := TPathData.Create ;
 path.Data := 'M10,10 100,10 100,100 10,100 10,10';
 path.Data := path.Data + ' M60,60 140,60 100,140 Z';
 with Canvas do begin
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkGradient ;
  Stroke.Gradient.Color := claRed ;
  Stroke.Gradient.Color1 := claYellow ;
  Stroke.Gradient.Style := TGradientStyle.gsLinear ;
  Stroke.Gradient.StartPosition.Point := PointF(0,0) ;
  Stroke.Gradient.StopPosition.Point := PointF(1,0) ;
  Stroke.Thickness := 20 ;
  Stroke.Dash := TStrokeDash.sdSolid ;
  Stroke.Cap := TStrokeCap.scRound ;
  Stroke.Join := TStrokeJoin.sjBevel ;
  DrawPath(path, 1.0);
 end;
 path.Free ;
end;
として確認してみます。

閉じる[Z]指定をしていない場合は、想定通り、第1点&最終点の結合部処理は行われていませんが、閉じる[Z]指定をしている場合は、正常に処理は行われている様子です。
 
 
第2引数 AOpacity 、透過率を指定する事が出来ます。
0.0(完全透明)〜1.0(完全不透明)の範囲内で指定します。
path := TPathData.Create ;
path.Data := 'M10,10 100,10 100,100 10,100 10,10';
path.Data := path.Data + ' M60,60 140,60 100,140 Z';
with Canvas do begin
 Clear(claWhite);
 Stroke.Kind := TBrushKind.bkSolid ;
 Stroke.Color := claBlue ;
 Stroke.Thickness := 10 ;
 DrawPath(path, 0.5);
end;
path.Clear ;
path.Data := 'M20,20 C120,20,120,20,120,120 L20,120 Z';
with Canvas do begin
 Stroke.Color := claRed ;
 Stroke.Thickness := 15 ;
 DrawPath(path, 0.5);
end;
path.Free ;
とした場合は、下図のようになります。

 
 
第3引数 ABrush でブラシを指定する記述方法もあります。
この場合は、直前で指定した Canvas の Strokeプロパティ内容ではなく、この引数の内容でパス図形描画が行われます。
 
例えば、下記のように記述すると
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
 br : TStrokeBrush ;
 pa1,pa2 : TPathData ;
begin
 br := TStrokeBrush.Create(TBrushKind.bkSolid,claBlue) ;
 br.Thickness := 10 ;
 pa1 := TPathData.Create ;
 pa1.Data := 'M10,10 100,10 100,100 10,100 10,10';
 pa1.Data := pa1.Data + ' M60,60 140,60 100,140 Z';
 pa2 := TPathData.Create ;
 pa2.Data := 'M10,10 C100,10,100,10,100,100 S10,100 10,75 Z';
 with Canvas do begin
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkGradient ;
  Stroke.Gradient.Color := claRed ;
  Stroke.Gradient.Color1 := claYellow ;
  Stroke.Gradient.Style := TGradientStyle.gsRadial ;
  Stroke.Thickness := 20 ;
  Stroke.Dash := TStrokeDash.sdSolid ;
  Stroke.Join := TStrokeJoin.sjBevel ;
  DrawPath(pa2, 1.0, br);
  DrawPath(pa1, 0.5);
 end;
 br.Free ;
 pa1.Free ;
 pa2.Free ;
end;
下図のように描画されます。

 
 
なお、キャンバス Canvas の Fill プロパティを指定しても、塗り潰しは行われません。塗り潰しを行いたい場合は、塗り潰しの部分を別途、DrawPath メソッドを実行する直前に FillPath メソッドを利用して描画させて下さい。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Dehi入門編
>Delphi2010
>DelphiXE3
▲2014/05/22
 2014/05/23
▼2014/05/24
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.