2013-04-17 13 views
8

Używam DrawText dla wszystkich moich potrzeb wyjściowych "tekst w prostokącie", ale nie widzę sposobu, aby narysować ciąg znaków, na przykład, z każdym innym wyrazem pogrubionym lub innym kolorem, lub nawet gorzej , różne tła dla wspomnianych losowo wybranych słów. Prawdopodobnie nie ma jednej procedury, która mogłaby to zrobić, o ile widzę, mogę się mylić, to jest główny punkt tego pytania. Czy ktoś może wskazać procedury, które mogą być interesujące dla kogoś, kto próbuje osiągnąć takie efekty? Dodatkowo, jeśli mam rację i nie ma prostego sposobu robienia tego, jaka byłaby zalecana ścieżka do zrobienia? Rysowanie każdego słowa osobno, a następnie próba sklejenia tego wszystkiego wydaje się koszmarnym snem, gdy zaczynasz myśleć o problemach, które mogą wynikać z tego, w mojej głowie: prawidłowe wyrównanie tekstu na pojedynczej poziomej linii, gdy masz różne czcionki lub rozmiary. ..Jak narysować tekst z innym formatowaniem czcionki na płótnie w delphi naraz?

Mam delphi xe3; jeśli ktoś może poprawić frazowanie mojego pytania i/lub tekstu, zrób to.

+0

Absolutnie nie możesz tego zrobić ** naraz **. Można jednak delegować tę pracę na coś podobnego do metapliku, a następnie rozcieńczyć wynik renderowania na płótnie, uzyskując widoczny * natychmiastowy efekt *. Płótno WinGDI rozpoznaje tylko podstawowe kody formatowania, takie jak linie lub karty. – OnTheFly

Odpowiedz

15

uzyskać pomoc od VCL, ponieważ metoda TCanvas.TextOut zwiększa x koordynować z poz piórkowych przez szerokość ciąg wyjściowy:

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

Tak czy inaczej, jeśli potrzebujesz więcej zaawansowane procedury wyprowadzania tekstu, dlaczego nie spojrzeć na DirectWrite?

+0

lubię DrawText przynajmniej do zawijania słów Zdolności, z tekstem będę musiał sobie z tym poradzić, co nie ułatwi sytuacji, straci luksusem zawijanie słów i innych opcji dla lepszego wyglądu tekstu ... a także, wyszczególniając wysokość skaluje wielkość czcionki? lub po prostu wybiera odpowiedni rozmiar czcionki dla tej wysokości? – Raith

+1

@Raith: To ostatnie. W każdym razie, jeśli potrzebujesz bardziej zaawansowanych procedur wypisywania tekstu, dlaczego nie spojrzeć na [DirectWrite] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd368038 (v = vs.85). aspx)? –

+0

DirectWrite (lub cokolwiek innego programowanie systemu Windows w tym zakresie) nie jest czymś, co znam. Właściwie umieściłeś to poprawnie: "zaawansowane procedury wyprowadzania tekstu", jeśli DirectWrite to robi, może to być dokładnie to, czego szukam, dziękuję. Muszę to zbadać. Poinformuję, czy to wystarczy jako odpowiedź. – Raith

2

Czy rozważałeś zastosowanie Richedit z jego bogatymi możliwościami formatowania? Jeśli chcesz narysować tekst na płótnie, a nie w oknie, wiadomość EM_FORMATRANGE pozwala skopiować graficzną reprezentację sformatowanego tekstu.

+0

rich (przym.) <> Zasięg (wer. N.) –

+0

@Andreas Rejbrand Dzięki, głupi błąd;) – MBo

+0

... aby * osiągnąć * a * bogate * formatowanie tekstu ... ;-) – OnTheFly

Powiązane problemy