Verwenden der Textlayout-Funktionen von FireMonkey
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.
Inhaltsverzeichnis
Erstellen einer geräteübergreifenden leeren Anwendung
- Erstellen Sie eine neue geräteübergreifende leere Anwendung.
- Ziehen Sie aus der Tool-Palette die folgenden Komponenten auf das Formular:
- Eine TImage-Komponente
- Eine TRadioButton-Komponente
- Drei TButton-Komponenten
- Erstellen Sie im Objektinspektor Ereignisbehandlungsroutinen für das Ereignis OnCreate von TForm, das Ereignis OnPaint von TImage und die Ereignisse OnClick der TButton-Komponenten.
Hinzufügen des Codes für das Textlayout
- Fügen Sie die folgenden Deklarationen hinzu:
In Delphi:
MyLayout: TTextLayout;
PathAnimation1: TPathAnimation;
In C++:
//header file
TPathAnimation *PathAnimation1;
TTextLayout *MyLayout;
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 = "";
}
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);
}
- 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();
}
- 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();
}
Verwendet
- TextLayout.TTextLayoutManager
- TextLayout.TTextLayout
- TextLayout.TTextLayout.AddAttribute
- TextLayout.TTextRange
- TextLayout.TTextAttribute
- TextLayout.TTextLayout.RenderLayout
- TextLayout.TTextLayout.PositionAtPoint
- TextLayout.TTextLayout.RegionForRange
- TextLayout.TTextLayout.ConvertToPath