TextWidth i kursywa...

0

Ktoś wie może, dlaczego TCanvas.TextWidth w połączeniu ze stylem tekstu fsItalic zwraca złą wartość? Tzn. zwraca dobrą, jeśli brać pod uwagę oba dolne lub górne rogi równoległoboku, jaki tworzą kontury pochyłego tekstu. Ale przecież prawdziwa szerokość takiego tekstu powinna być liczona na podstawie lewego dolnego i prawego górnego rogu... Pokazuje to rysunek:

user image

Na czerwono pokazana jest szerokość, jaką zwraca TextWidth, a na zielono to, co chcę otrzymać. To jakiś bug, czy twórcy delphi/windowsa olali sobie zupełnie kwestię kursywy? A może da się to pobrać w inny sposób?

0

Źle mnie zrozumiałeś. Nie chcę żadnego zaznaczenia w kształcie równoległoboku. Po prostu chcę, żeby TextWidth (lub cokolwiek innego) liczyło szerokość tekstu z uwzglednieniem kursywy Ten równoległobok to było tylko matematyczne wytłumaczenie, o co mi chodzi.

0

mozesz do otrzymanego wyniku tej funkcji dodac ilosc pixeli, ktore ta funkcja nie policzyla ...

0

Fajnie, tylko skąd będę wiedział, ilu pixeli funkcja nie policzyła...? A może wydłużenie tekstu jest stałe dla każdej czcionki?

0

thenkles .. zdaje się, że nie ma mechanizmów obliczających to. Zatem - jeśli używasz stałej wielkości czcionki i kroju - można się ew. pokusić o stworzenie dość "niewygodnej funkcji", która będzie to liczyć:

function ItalicLength(s: string): Integer

W środku zadeklarowane stałe będące długościami poszczególnych liter .. i sumowanie.. - jedyne rozwiązanie jakie przychodzi mi do głowy, zapewne niezbyt eleganckie. :)

0

No cóż, szkoda... Przy okazji testów, doszedłem do tego, że źle w ogóle sprecyzowałem problem... Bo tekst pisany kursywą jest tak naprawdę o kilka px węższy, niż zwykły, a nie szerszy :P. Czyli także rysunek jest zły i reszta wyjasnień... Tak, czy inaczej, TextWidth nie bierze pod uwagę stylu fsItalic, zwracając długość tekstu z pominięciem tego atrybutu. Z dalszych testów wynika, że stosunek szerokości tekstu zwykłego, do szerokości kursywy także nie jest stały. Chyba więc zadanie jest awykonalne. Jeśli jednak ktoś na coś by wpadł, proszę o informacje.

0

GetTextExtentPoint32()
GettCharWidth()

Zresztą co tam będę wymieniał:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_8smq.asp

Któraś z wymienionych z lewej strony funkcji powinna zwrócic to czego potrzebujesz

1 użytkowników online, w tym zalogowanych: 0, gości: 1