Строка Word Wrap в окне сообщения? - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь обернуть слова данной строки и отобразить ее в окне сообщения, используя SFML (<- это не имеет значения). </p>

Итак, я пытаюсь сделать этовставить новую строку перед словом, которое больше ширины окна сообщения.Вот код:

string& message::word_wrap( string& msg , int w, int pt_size )
{
    int text_width = w;
    vector< string > lines;
    string temp ( msg );
    temp += " ";
    int n = 0, p = 0;

    while ( n != -1 )
    {
        string substr;
        n = temp.find( " ", p+1 );
        if ( (n * pt_size) >= text_width )
        {
            substr = temp.substr( 0, p );
            lines.push_back( substr );
            if ( n != -1 )
                temp = temp.substr( p+1, string::npos );
            p = 0;
        }

        else p = n;
    }

    string rtn;
    for ( int i = 0; i < lines.size(); i++ ) rtn += lines[i] + '\n';
    return rtn;
}

Я использую его в своем классе следующим образом:

message::message( sf::RenderWindow& App, const string& msg, int w, int h ) : app(App)
{
    /* irrelevant code */

    string m = msg; // <--
    m = this->word_wrap( m, w, text.GetSize() ); // <--
    text.SetText(m);
}

Есть две проблемы.

  1. Алгоритм переносит словадо того, как они превысят ширину окна сообщения.
  2. Последние несколько слов по какой-то причине пропускаются, когда я использую его следующим образом:

    pro::message::display( App, "Hello World! Yada Yada Bla Bla Yda Yada Hehehe Hehe Hfmaf Heh last few words" );
    

Пропускает последнее слово, слова :

last few words get skipped

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Простое решение - сделать копию строки и заменить пробел новой строкой, когда это необходимо.

Проблема, с которой вы столкнулись, заключается в том, что, когда вы находите последний пробел, где вам нужно сделать разрыв строки, после этого у вас остается текст, который не вставляется в вектор. Вам нужно проверить, есть ли текст после цикла, и добавить его в виде отдельной строки.

0 голосов
/ 03 февраля 2012

Я бы полностью переписал этот код:)

Вам просто нужно вставить символ новой строки в исходной строке: учитывая максимальную длину строки, скажем max_len, просто укажите на символ max_len в исходной строке и начните поиск пробела назад. Когда найден (что если вы этого не сделаете?), Замените его символом новой строки, а затем продолжите с этого момента.

...