2013-04-17 16 views
8

Sto usando DrawText per tutti i miei output di "testo in rettangolo", tuttavia non riesco a vedere un modo per disegnare una stringa, ad esempio, con ogni altra parola in grassetto o di colore diverso, o, peggio ancora , sfondi diversi per le parole selezionate a caso. Probabilmente non esiste una singola procedura che possa fare tutto ciò che posso vedere, potrei sbagliarmi, questo è il punto principale di questa domanda. Qualcuno può indicare procedure che potrebbero essere di interesse per qualcuno che cerca di ottenere tali effetti? Inoltre, se sono corretto e non c'è un modo semplice per farlo, quale sarebbe il percorso consigliato da intraprendere? Disegnare ogni parola separatamente e poi provare a incollare tutto insieme sembra un incubo quando inizi a pensare a problemi che possono sorgere da questo, in cima alla mia testa: allineamento corretto del testo su una singola linea orizzontale quando hai font o dimensioni variabili. ..Come disegnare il testo con una diversa formattazione del carattere su una tela in delphi in una volta?

Ho delphi xe3; se qualcuno può migliorare il fraseggio della mia domanda e/o del testo, per favore fallo.

+0

Non puoi assolutamente farlo ** in una volta **. Tuttavia, è possibile delegare questo lavoro a smth come metafile e quindi eseguire il blit del risultato di rendering sulla tela ottenendo un * effetto * immediatamente *. WinGDI canvas riconosce solo codici di formattazione molto semplici come line-feed o tab. – OnTheFly

risposta

15

È possibile ottenere un po 'di aiuto da parte della VCL, in quanto il metodo TCanvas.TextOut aumenta la x coordinata dei pos penna per la larghezza della stringa di output:

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

In ogni caso, se avete bisogno di più routine di output di testo avanzate, perché non dare un'occhiata a DirectWrite?

+0

mi piace DrawText almeno per il suo involucro di parole capacità, con textout avrei bisogno di gestirlo, il che non semplifica la situazione, perde il lusso del word wrapping e altre opzioni per un testo migliore ... e inoltre, specificando l'altezza ridimensiona la dimensione del carattere? o semplicemente seleziona una dimensione del carattere appropriata per quell'altezza? – Raith

+1

@Raith: quest'ultimo. In ogni caso, se hai bisogno di più routine di output di testo avanzate, perché non dare un'occhiata a [DirectWrite] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd368038 (v = vs.85). aspx)? –

+0

DirectWrite (o qualsiasi altra cosa sia la programmazione Windows) non è qualcosa che mi è familiare. In realtà, lo hai messo correttamente: "routine di output di testo avanzate", se DirectWrite lo fa, potrebbe essere esattamente quello che sto cercando, grazie. Devo investigare. Informerò se questo è sufficiente come risposta. – Raith

2

Hai considerato l'utilizzo di Richedit con le sue capacità di formattazione piuttosto ricche? Se è necessario disegnare del testo su tela, non in finestra, il messaggio EM_FORMATRANGE consente di copiare la rappresentazione grafica del testo formattato.

+0

rich (adj.) <> Reach (v .; n.) –

+0

@Andreas Rejbrand Grazie, errore stupido;) – MBo

+0

... per * raggiungere * un * rich * formattazione del testo ... ;-) – OnTheFly

Problemi correlati