1

Delphi 7 には、DVD の湾曲したエッジに沿って著作権テキストを描画する次のコードがあります。Graphics32 の古いバージョンを使用しています。

Graphics32 の最新コードを使用して Delphi XE5 に切り替えていますが、このコードはコンパイルされなくなりました。特に LoadArcCurve と drawingBuffer.RenderFittedText はメソッドとして存在しなくなりました。

procedure TCDLabel.DrawCopyrightText(const drawingBuffer: TBitmap32Ex);
var
  FixedPointArray : TArrayOfFixedPoint;
  Center : TFixedPoint;
  vAngle1 : double;
  vAngle2 : double;
  radius : integer;
  CopyrightText : string;
  textColor : TColor32;
begin
  radius := (fImageSize div 2) - 30;
  UpdateTextTransform(8{2.3}, drawingBuffer);
  Center.x := GR32.Fixed(fImageSize div 2);
  Center.y := GR32.Fixed(fImageSize div 2);
  vAngle1 := DegToRad(-130);
  textColor := clWhite32;
  vAngle2 := DegToRad(0);
  LoadArcCurve(Center, GR32.Fixed(radius), GR32.Fixed(radius), vAngle1, vAngle2, FixedPointArray);
  CopyrightText := Format('%s %s Dystopia Unlimited. All rights reserved.', [GetCopyrightSymbol, fCopyrightYears]);
  drawingBuffer.RenderFittedText(CopyrightText, textColor, pdoAntialising or pdoFilling, FixedPointArray);
  FixedPointArray := NIL;
end; {DrawCopyrightText}

Delphi XE5 で最新の Graphic32 コードを使用して次のコード スニペットを作成し、他のさまざまな同様の方法を試みましたが成功しませんでした。

canvas := TCanvas32.Create(drawingBuffer); // drawingBuffer is a TBitmap32
try
  canvas.Brushes.Add(TStrokeBrush);
  canvas.Brushes[0].Visible := TRUE;
  (canvas.Brushes[0] as TStrokeBrush).StrokeWidth := 2;
  (canvas.Brushes[0] as TStrokeBrush).FillColor := clWhite32;

  canvas.Path.BeginPath;
  canvas.Path.Arc(Center, -130, 0, radius);
  canvas.Path.EndPath;
  TextToPath(drawingBuffer.Font.Handle, canvas.Path, FloatRect(0, 0, fImageSize, fImageSize), CopyrightText);

私が見つけることができる新しい Graphics32 のすべての例は、Delphi コントロール キャンバスに直接描画しているように見えますが、TBitmap32 に描画する必要があります。

Delphi XE5 と最新バージョンの Graphics32 を使用して、イメージ/ビットマップの円弧に沿ってテキストをレンダリングするにはどうすればよいですか?

4

2 に答える 2

1

David Heffernan が提供した Angus Johnson の作品へのポインターを使用すると、次のコードが私の質問に対する解決策になります。

このコードでは、GR32_Lines、GR32_Text、GR32_Misc などの単位を使用しています。また、メモリを保護したり、リリース可能なコードに必要なその他の保護プロセスを実行したりしません。

procedure DrawCopyrightText(const drawingBuffer: TBitmap32);
var
  fixedPointArray : TArrayOfFixedPoint;
  CopyrightText : string;
  ttFont : TTrueTypeFont;
  text32 : TText32;
  i: integer;
  polyPolyPts: TArrayOfArrayOfArrayOfFixedPoint;
begin
  CopyrightText := Format('%s %s Dystopia Unlimited. All rights reserved.', [GetCopyrightSymbol, fCopyrightYears]);

  text32 := TText32.Create;
  ttFont := TTrueTypeFont.Create(COPYRIGHT_FONT_NAME, COPYRIGHT_FONT_SIZE);
  fixedPointArray := GetArcPoints(FloatRect(30, 30, 2370, 2370), -140, 0);
  polyPolyPts := text32.GetEx(fixedPointArray, CopyrightText, ttFont, aLeft, aMiddle, true, 2);
  for i := 0 to high(polyPolyPts) do
    if length(polyPolyPts[i]) > 0 then
      SimpleFill(drawingBuffer, polyPolyPts[i], clWhite32, clWhite32);
end;
于 2014-09-22T14:50:21.333 に答える