Ostatnio zmodyfikowano wczoraj o godz. 23:40
tBane Temat założony przez niniejszego użytkownika |
[SFML 2.X] Notepad - aplikacja notatnik » 2025-05-17 16:45:50 Witam. Chcę napisać aplikację notatnik w SFML 2.6.2. Aplikacja powinna: -stosować wybraną czcionkę o danym rozmiarze -wrapować tekst z uwzględnieniem tabulatorów, spacji oraz enterów w dowolnej ilości -obsługiwać kursor - (ustawienie kursora, zaznaczanie tekstu) -zapisywać/wczytywać pliki Jak na razie wiem jak zrobić pierwszy oraz ostatni punkt, ale nie mam pojęcia jak wrapować tekst, a także jak obsłużyć kursor No więc zaczynam od tego prostego kodu. #include <SFML/Graphics.hpp>
int main() { sf::RenderWindow window( sf::VideoMode( { 640, 640 } ), "Easy Notepad!" ); sf::Font font; font.loadFromFile( "arial.ttf" ); short characterSize = 17; sf::Text content; content.setFont( font ); content.setCharacterSize( characterSize ); content.setString( L"to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst,to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst,to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst," ); content.setFillColor( sf::Color::White ); while( window.isOpen() ) { sf::Vector2i mousePosition = sf::Mouse::getPosition( window ); sf::Vector2f worldMousePosition = window.mapPixelToCoords( mousePosition ); sf::Event event; while( window.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) { window.close(); } } window.clear(); window.draw( content ); window.display(); } }
|
|
DejaVu |
» 2025-05-17 16:48:07 Najpierw zrób sobie komponent taki jak scrollbar poziomy i pionowy. Potem zaimplementuj wczytanie danych np. do std::vector<std::wstring>. Potem zrób renderowanie tekstu bez zawijania, ale z obsługą scrollowania. Potem zrób 'kursor', który umożliwia wprowadzanie tekstu w miejscu gdzie jest kursor. Na koniec dopiero pomyśl o zawijaniu, bo do tego czasu i tak się dużo nauczysz. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-05-17 16:57:30 Scrollbar ostatnio pisałem, więc nie będzie z tym problemu. Nie wiem po co tylko poziomy ... Skoro tekst wczytać do std::vector<std::wstring> to chyba musi być zawijanie wierszy - czyli wraper wymagany. Co do kursora, który pozwala wprowadzać dane w miejscu gdzie jest kursor to czy dobrym rozwiązaniem będzie zastosowanie content.findCharacterPos( index ) ? |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-05-17 18:43:03 Dobra napisałem pozycjonowanie kursora. Teraz potrzebuję podzielić tekst na linie (jeszcze bez wrapowania) i mam pytanie - jak pozycjonować kolejne linie tekstu ? Wcześniej robiłem to za pomocą funkcji getLineHeight() ale chciałbym użyć rzeczywistej wysokości linii. float getLineHeight( short characterSize ) { return float( characterSize ) * 1.3f; }
#include <SFML/Graphics.hpp> #include <iostream>
sf::Font font; short characterSize; sf::Text content; std::wstring text;
sf::Vector2i mousePosition; sf::Vector2f worldMousePosition; sf::RectangleShape cursor;
int getCursorPosition() { sf::Text content = sf::Text( text, font, characterSize ); for( size_t i = 0; i < content.getString().getSize(); ++i ) { sf::Vector2f charPos = content.findCharacterPos( i ); float nextX = content.findCharacterPos( i + 1 ).x; sf::FloatRect charRect( charPos.x, charPos.y, nextX - charPos.x, characterSize ); if( charRect.contains( worldMousePosition ) ) { if( worldMousePosition.x < charRect.left + charRect.width / 2 ) return i - 1; else return i; } } return - 1; }
int main() { sf::RenderWindow window( sf::VideoMode( { 640, 640 } ), "Easy Notepad!" ); font.loadFromFile( "arial.ttf" ); characterSize = 17; text = L"to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst,\n" L"to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst,\n" L"to jest przykładowy tekst, to jest przykładowy tekst, to jest przykładowy tekst\n"; content.setFont( font ); content.setCharacterSize( characterSize ); content.setString( text ); content.setFillColor( sf::Color::White ); cursor = sf::RectangleShape( sf::Vector2f( 2, characterSize ) ); cursor.setFillColor( sf::Color::Red ); while( window.isOpen() ) { mousePosition = sf::Mouse::getPosition( window ); worldMousePosition = window.mapPixelToCoords( mousePosition ); int i = getCursorPosition(); cursor.setPosition( content.findCharacterPos( i + 1 ) ); sf::Event event; while( window.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) { window.close(); } } window.clear(); window.draw( content ); window.draw( cursor ); window.display(); } }
|
|
pekfos |
» 2025-05-17 21:25:26 |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-05-17 21:34:49 Dzięki pekfos :-)
Mam jeszcze pytanie. Jak zrobić kolorowanie składni?
Dajmy na to mam napis "to jest kolorowy tekst" i chciałbym żeby tylko słowo "kolorowy" miało inny kolor niż reszta frazy. Czy muszę tworzyć trzy oddzielne teksty, żeby to zrealizować? |
|
« 1 » |