Verwenden der Textlayout-Funktionen von FireMonkey

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu FireMonkey-Textlayout


In folgendem Beispiel wird die Verwendung der in FireMonkey verfügbaren Textlayout-Funktionen gezeigt. Das Beispiel enthält den zum Rendern von Text auf einem TImage-Objekt erforderlichen Code, und zeigt, wie die Methoden PositionAtPoint, RegionForRange und ConvertToPath verwendet werden.

Erstellen einer geräteübergreifenden leeren Anwendung

  1. Erstellen Sie eine neue geräteübergreifende leere Anwendung.
  2. Ziehen Sie aus der Tool-Palette die folgenden Komponenten auf das Formular:
  3. Erstellen Sie im Objektinspektor Ereignisbehandlungsroutinen für das Ereignis OnCreate von TForm, das Ereignis OnPaint von TImage und die Ereignisse OnClick der TButton-Komponenten.
  • Das Formular sollte beim Entwurf folgendermaßen aussehen:
TextLayout Design Time.png

Hinzufügen des Codes für das Textlayout

  1. Fügen Sie die folgenden Deklarationen hinzu:

In Delphi:

MyLayout: TTextLayout;
PathAnimation1: TPathAnimation;

In C++:

//header file
TPathAnimation *PathAnimation1;
TTextLayout *MyLayout;
  1. Fügen Sie der Ereignisbehandlungsroutine OnCreate von TForm den folgenden Code hinzu.

In Delphi:

procedure TForm1.FormCreate(Sender: TObject);
 begin
   RadioButton1.Position.X := Image1.Position.X - 5;
   RadioButton1.Position.Y := Image1.Position.Y - 5;
   RadioButton1.Text := '';
 end;


In C++:

void __fastcall TForm1::FormCreate(TObject *Sender) {
	RadioButton1->Position->X = Image1->Position->X - 5;
	RadioButton1->Position->Y = Image1->Position->Y - 5;
	RadioButton1->Text = "";
}
2. Fügen Sie der OnPaint-Ereignisbehandlungsroutine von TImage den folgenden Code hinzu.

In Delphi:

procedure TForm1.Image1Paint(Sender: TObject; Canvas: TCanvas;
   const ARect: TRectF);
 var
   WPosition: Integer;
 begin
   MyLayout := TTextLayoutManager.DefaultTextLayout.Create;
   MyLayout.BeginUpdate;
   MyLayout.TopLeft := TPointF.Create(0, 0);
   MyLayout.Font.Size := 78;
   MyLayout.Font.Family := 'Tahoma';
   MyLayout.Font.Style := [TFontStyle.fsBold];
   MyLayout.Text := 'TEXT';
   MyLayout.Color := TAlphaColorRec.Brown;
   WPosition := MyLayout.PositionAtPoint(TPointF.Create(159, 120));
   MyLayout.AddAttribute(TTextRange.Create(WPosition, 3),
     TTextAttribute.Create(TFont.Create, TAlphaColorRec.Black));
   MyLayout.EndUpdate;
   MyLayout.RenderLayout(Canvas);
 end;

In C++:

void __fastcall TForm1::Image1Paint(TObject *Sender, TCanvas *Canvas,
	const TRectF &ARect)

{
	int WPosition;
	Fmx::Graphics::TFont *font;
	MyLayout = TTextLayoutManager::TextLayoutForClass
		(TTextLayoutManager::DefaultTextLayout);
	MyLayout->BeginUpdate();
	MyLayout->TopLeft = TPointF(0, 0);
	MyLayout->Font->Size = 78;
	MyLayout->Font->Family = "Tahoma";
	MyLayout->Font->Style = TFontStyles(1);
	MyLayout->Text = "TEXT";
	MyLayout->Color = TAlphaColorRec::Brown;
	WPosition = MyLayout->PositionAtPoint(TPointF(159, 120));
	MyLayout->AddAttribute(TTextRange(WPosition, 3),
		TTextAttribute(font, TAlphaColorRec::Black));
	MyLayout->EndUpdate();
	MyLayout->RenderLayout(Canvas);
}
  • Zur Laufzeit sieht das Formular nun folgendermaßen aus:
TextLayout Render.png
3. Fügen Sie den Ereignisbehandlungsroutinen OnClick der TButton-Komponenten ("Convert Text to Path" und "Start Animation") den folgenden Code hinzu, um den Text in einen Pfad zu konvertieren und die Animation zu starten:

In Delphi:

procedure TForm1.Button1Click(Sender: TObject);
 var
   PathD: TPathData;
 begin
   PathAnimation1 := TPathAnimation.Create(Self);
   PathAnimation1.Parent := RadioButton1;
   PathD := TPathData.Create();
   MyLayout.ConvertToPath(PathD);
   PathAnimation1.Path := PathD;
   PathAnimation1.Loop := True;
   PathAnimation1.Duration := 50;
 end;
 
 procedure TForm1.Button2Click(Sender: TObject);
 begin
   PathAnimation1.Start;
 end;

In C++:

void __fastcall TForm1::Button1Click(TObject *Sender) {
	TPathData *PathD;
	PathAnimation1 = new TPathAnimation(this);
	PathAnimation1->Parent = RadioButton1;
	PathD = new TPathData();
	MyLayout->ConvertToPath(PathD);
	PathAnimation1->Path = PathD;
	PathAnimation1->Loop = true;
	PathAnimation1->Duration = 50;
}

void __fastcall TForm1::Button2Click(TObject *Sender) {
	PathAnimation1->Start();
}
  • Zur Laufzeit sieht das Formular nun folgendermaßen aus:
TextLayout Animation.gif
4. Fügen Sie der Ereignisbehandlungsroutine OnClick von TButton für RegionforRange den folgenden Code hinzu:

In Delphi:

procedure TForm1.Button3Click(Sender: TObject);
 var
   MyRects: TRegion;
 begin
   MyRects := MyLayout.RegionForRange(TTextRange.Create(1, 1));
   Image1.Bitmap.Canvas.BeginScene;
   Image1.Bitmap.Canvas.DrawRect(MyRects[0], 0, 0, AllCorners, 100);
   Image1.Bitmap.Canvas.EndScene;
 end;

In C++:

void __fastcall TForm1::Button3Click(TObject *Sender) {
	TRegion MyRects;
	MyRects = MyLayout->RegionForRange(TTextRange(1, 1));
	Image1->Bitmap->Canvas->BeginScene();
	Image1->Bitmap->Canvas->DrawRect(MyRects[0], 0, 0, AllCorners, 100);
	Image1->Bitmap->Canvas->EndScene();
}
  • Zur Laufzeit sieht das Formular nun folgendermaßen aus:
TextLayout RegionForRange.png

Verwendet

Siehe auch