2013-04-17 5 views
8

Ich habe DrawText für alle meine "Text in Rechteck" -Ausgabe benötigt, aber ich sehe keine Möglichkeit zum Zeichnen einer Zeichenfolge, zum Beispiel mit jedem anderen Wort fett oder von anderer Farbe, oder, noch schlimmer unterschiedliche Hintergründe für die zufällig ausgewählten Wörter. Es gibt wahrscheinlich keine einzige Prozedur, die das tun kann, soweit ich sehen kann, ich könnte falsch liegen, das ist der Hauptpunkt dieser Frage. Kann jemand auf Verfahren hinweisen, die für jemanden von Interesse sein könnten, der solche Effekte erzielen möchte? Außerdem, wenn ich richtig bin und es keine einfache Möglichkeit gibt, dies zu tun, was wäre der empfohlene Weg? Jedes Wort einzeln zu zeichnen und dann zu versuchen, all das zusammen zu kleben, scheint ein Albtraum zu sein, wenn man anfängt, über Probleme nachzudenken, die daraus entstehen können: richtiger Textausrichtung auf einer horizontalen Linie, wenn man verschiedene Schriftarten oder Schriftgrößen hat. ..Wie zeichne ich Text in Textform mit verschiedenen Schriftformatierungen gleichzeitig auf eine Leinwand?

Ich habe Delphi xe3; wenn jemand die Formulierung meiner Frage und/oder des Textes verbessern kann, tun Sie es bitte.

+0

Sie können es nicht ** auf einmal **. Sie könnten diesen Job jedoch an eine ähnliche Metadatei delegieren und dann das Rendering-Ergebnis an Ihre Leinwand schicken, um den * augenblicklichen * Effekt zu erzielen. WinGDI-Canvas erkennt nur sehr einfache Formatierungscodes wie Zeilenvorschübe oder Tabs. – OnTheFly

Antwort

15

Sie etwas Hilfe von der VCL erhalten, da die TCanvas.TextOut Methode der x der Stift pos durch die Breite der Ausgabezeichenfolge koordinieren erhöht:

procedure TForm1.FormPaint(Sender: TObject); 
begin 
    Canvas.MoveTo(20, 100); 

    Canvas.Font.Name := 'Segoe UI'; 
    Canvas.Font.Color := clMaroon; 
    Canvas.Font.Style := []; 
    Canvas.Font.Height := 64; 
    Canvas.TextOut(Canvas.PenPos.X, Canvas.PenPos.Y, 'This '); 

    Canvas.Font.Color := clNavy; 
    Canvas.Font.Style := [fsBold]; 
    Canvas.Font.Height := 64; 
    Canvas.TextOut(Canvas.PenPos.X, Canvas.PenPos.Y, 'is '); 

    Canvas.Font.Name := 'Bookman Old Style'; 
    Canvas.Font.Color := clBlack; 
    Canvas.Font.Style := [fsItalic]; 
    Canvas.Font.Height := 64; 
    Canvas.TextOut(Canvas.PenPos.X, Canvas.PenPos.Y, 'a '); 

    Canvas.Font.Name := 'Courier New'; 
    Canvas.Font.Color := clSilver; 
    Canvas.Font.Style := []; 
    Canvas.Font.Height := 64; 
    Canvas.TextOut(Canvas.PenPos.X, Canvas.PenPos.Y, 'test!'); 
end; 

Screenshot http://privat.rejbrand.se/canvastextpos.png

Wie auch immer, wenn Sie mehr brauchen erweiterte Textausgabe Routinen, warum nicht einen Blick auf DirectWrite?

+0

Ich mag DrawText zumindest für seine Wortumbruch Fähigkeiten, mit Text ich würde damit umgehen müssen, was die Situation nicht einfacher macht, verlieren den Luxus der Wortumbruch und andere Optionen für besser aussehenden Text ... und auch, Höhe angeben skaliert die Größe der Schriftart? oder wählt einfach eine passende Schriftgröße für diese Höhe aus? – Raith

+1

@ Raith: Letzteres. Wie auch immer, wenn Sie erweiterte Textausgabe-Routinen benötigen, werfen Sie einen Blick auf [DirectWrite] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd368038 (v = vs.85)). aspx)? –

+0

DirectWrite (oder irgendetwas Windows-Programmierung für diese Angelegenheit) ist etwas, das ich nicht kenne. Eigentlich hast du es richtig ausgedrückt: "erweiterte Textausgabe-Routinen", wenn DirectWrite das tut, könnte es genau das sein, wonach ich suche, danke. Ich muss nachforschen. Ich werde informieren, wenn dies als Antwort ausreicht. – Raith

2

Haben Sie erwogen, Richedit mit seinen reichhaltigen Formatierungsfähigkeiten zu verwenden? Wenn Sie Text im Zeichenbereich und nicht im Fenster zeichnen müssen, ermöglicht die EM_FORMATRANGE-Nachricht das Kopieren einer grafischen Darstellung von formatiertem Text.

+0

reich (adj.) <> Erreichen (v .; n.) –

+0

@Andreas Rejbrand Danke, dummer Fehler;) – MBo

+0

... zu * reich * a * reichen * Textformatierung ... ;-) – OnTheFly

Verwandte Themen