2017-07-26 9 views
1

私は、標準のデルファイ描画メソッドではなく、描画のためにGraphics32ライブラリを使用するように、デルファイXE4アプリケーションを変換しようとしています。Graphics32ハッチングパターンのポリゴンを塗る

私が行うことの1つは、対角線のクロスハッチパターンを持つ小さな楕円を含むアイコンを描画することです。アイコンは次のようになります。ここでは

enter image description here

は、私は、標準TCanvas描画メソッドでそれを行う方法です。

ACanvas.Brush.Color := shape.pcolor; 
ACanvas.Brush.Style := bsdiagCross; 
ACanvas.Ellipse(-13, -9, 13, 9); 

私はGraphics32は、以下を実行して楕円を描くことができます:

var  
    Polygon : TArrayOfFloatPoint; 
begin  
    Polygon := Ellipse(0, 0, 13, 9); 
    PolylineFS(Bitmap, Polygon, pcolor, True, UAVPenWidth); 

しかし、対角線のクロスハッチングパターンを簡単に複製する方法はありますか?私はTBitmapPolygonFillerクラスを使用することができますが、これはビットマップを使って塗りつぶすことです。この図は、TPositionedLayerの場合はOnPaintイベントハンドラであることに注意してください。

答えて

2

これまでのところ、Graphics32には直接パターンはサポートされていませんが、使用するパターンのようなパターンを作成する方法は数多くあります。

ここではサンプルポリゴンフィラーを使用して一つの解決策です:

まずあなたはハッチパターンのためのサンプラークラスを記述する必要があります。このようなサンプラーを構築する方法はいくつかあります。下には、非常にシンプルなものを見つけることができます。

type 
    THatchedPatternSampler = class(TCustomSampler) 
    public 
    function GetSampleInt(X, Y: Integer): TColor32; override; 
    end; 

function THatchedPatternSampler.GetSampleInt(X, Y: Integer): TColor32; 
begin 
    Result := 0; 
    if ((X - Y) mod 8 = 0) or ((X + Y) mod 8 = 0) then 
    Result := clRed32 
end; 

あなただけ(GetSampleInt)ここでは1つのメソッドをオーバーライドする必要があり、他のすべてのメソッドは、上位クラスから使用することができます。

これで少し畳み込まれます。サンプルを使用するためには、このようなTSamplerFillerのトップにそれを使用する必要があります。

Sampler := THatchedPatternSampler.Create; 
Filler := TSamplerFiller.Create(Sampler); 

あなたは、このフィラーを持ったら、あなたはPolygonFSあるいはPolylineFSでそれを使用することができます。

最後のコードは次のようになります。

var 
    Polygon: TArrayOfFloatPoint; 
    Sampler: THatchedPatternSampler; 
    Filler: TSamplerFiller; 
begin 
    Polygon := Ellipse(128, 128, 120, 100); 
    Sampler := THatchedPatternSampler.Create; 
    try 
    Filler := TSamplerFiller.Create(Sampler); 
    try 
     PolygonFS(PaintBox32.Buffer, Polygon, Filler); 
    finally 
     Filler.Free; 
    end; 
     finally 
    Sampler.Free; 
    end; 

    PolylineFS(PaintBox32.Buffer, Polygon, clRed32, True, 1); 
end; 

これは(ここでは:TPaintBox32インスタンスのバッファ)ビットマップの中央にかなり大きな楕円を描きますし、斜線のサンプラーのコードでそれを埋めます。最後に、PolylineFS関数を使用して実線のアウトラインが描画されます。

これは、GetSampleIntがピクセルごとに呼び出されるときの最速のアプローチではありません。しかし、何が起こるのかを理解するのが一番簡単です。

もっと速い選択肢の場合は、直接フィラーを直接使用する必要があります。

function THatchedPatternFiller.GetFillLine: TFillLineEvent; 
begin 
    Result := FillLine; 
end; 

しかし、FillLine方法が少し複雑このようになります:

procedure THatchedPatternFiller.FillLine(Dst: PColor32; DstX, DstY, 
    Length: Integer; AlphaValues: PColor32); 
var 
    X: Integer; 
begin 
    for X := DstX to DstX + Length do 
    begin 
    if ((X - DstY) mod 8 = 0) or ((X + DstY) mod 8 = 0) then 
     Dst^ :=clRed32 
    else 
     Dst^ := 0; 

    Inc(Dst); 
    end; 
end; 
GetFillLineは、のような単純な取得方法は

type 
    THatchedPatternFiller = class(TCustomPolygonFiller) 
    private 
    procedure FillLine(Dst: PColor32; DstX, DstY, Length: Integer; AlphaValues: PColor32); 
    protected 
    function GetFillLine: TFillLineEvent; override; 
    end; 

:あなたはこのようTCustomPolygonFillerから直接導き出すことができます

DstYは一定のままなので、コードをリファクタリングしてパフォーマンスを向上させることもできます。または、アセンブラ(SSE)を使用してコードをスピードアップすることもできますが、これは単純な機能のために過度の作業になると思います。

関連する問題