latajacaryba Temat założony przez niniejszego użytkownika |
SFML textbox, na jaką literę wskazuje kursor - szerokość tekstu. » 2017-08-30 15:56:12 Witam.Chcę stworzyć textboxa, przy czym chciałbym, by dało się zaznaczać tekst. I kiedy mamy napis:
"napis" to można było wpisać coś pomiędzy p oraz i, itd. Oczywiście najpierw potrzebne jest zaznaczenie przez użytkownika, gdzie chce coś wpisać, czyli kliknięcie między dwie litery. Mam następujący problem: umiem sprawdzić długość danego sf::Text, ale jak sprawdzić, gdzie wskazuje kursor? Wiadomo, że 'M' jest szersze od 'i' (przynajmniej w większości czcionek), w dodatku występują przerwy między znakami (?), także jak określić, na jakie litery w tekście wskazuje kursor? Nie ma funkcji typu: getGlobalBounds(int IndexPierwszegoZnaku, int IndeksOstatniegoZnaku)? |
|
michal11 |
» 2017-08-30 16:08:36 Jeżeli chcesz to tylko wykorzystać to zobacz sobie tgui lub sfgui, jeżeli chcesz to napisać dla siebie (np. do nauki) to spójrz sobie w source tych bibliotek. |
|
pekfos |
» 2017-08-30 16:25:25 Skoro umiesz sprawdzić długość tekstu, to sprawdzaj ile tekstu można wcisnąć przed kursor. |
|
1aam2am1 |
» 2017-08-30 17:13:37 sf::Font ma funkcje do sprawdzania szerokości litery dla danej wielkości czcionki. Oraz funkcje sprawdzającą odstęp pomiędzy literami. sf::Font::getGlyph sf::Font::getKerning |
|
DejaVu |
» 2017-08-30 17:30:41 To ja dorzucę, aby było trudniej :D Szerokość czionki będzie ulegała zmianie w zależności od zastosowanego zooma na scenie (jeżeli będziesz chciał zachować ostrość czcionki wraz z zoomowaniem) :) |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-08-30 19:37:34 @pekfos Skoro umiesz sprawdzić długość tekstu, to sprawdzaj ile tekstu można wcisnąć przed kursor. |
Mogę sprawdzić szerokość całego obiektu sf::Text, a nie fragmentu, np. 10 liter. @DejaVu przeżyję bez tego ;) @1aam2am1 Widziałem te metody, ale czy to nie będzie za długo trwało? Sprawdzanie litera po literze, odstęp po odstępie? Myślałem też o tym, by wrzucać część tekstu do innego obiektu sf::Text i tam badać jego długość, ale nie wiem z kolei, czy to będzie faktyczna długość tekstu, w sensie czy sf::Text nie dodaje sobie jakiś marginesów itp. |
|
pekfos |
» 2017-08-30 19:46:36 Widziałem te metody, ale czy to nie będzie za długo trwało? Sprawdzanie litera po literze, odstęp po odstępie? |
A co twoim zdaniem robi sf::Text, kiedy wrzucasz nowy napis? czy to będzie faktyczna długość tekstu, w sensie czy sf::Text nie dodaje sobie jakiś marginesów itp. |
Jak chcesz mieć dokładność co do pixela, to lepiej użyj font.getGlyph(..).advance w pętli zamiast bounding boxa z sf::Text. float adv = 0.f; wchar_t last = 0; for( auto wc: _str ) { adv += ref_font.getGlyph( wc, fontSize, bold ).advance; adv += ref_font.getKerning( last, wc, fontSize ); last = wc; } return adv; |
|
1aam2am1 |
» 2017-08-30 20:54:32 Stwierdzam że metoda z funkcjami jest dużo szybsza niż wrzucanie do sf::Text fragmentu. Zrobiłem na tych funkcjach zawijanie linii :) I nie będzie to dużo trwało. Jeżeli dobrze to zrobisz. |
|
« 1 » |