我正在尝试包装给定字符串的单词并使用 SFML 将其显示在消息框中(<-- 这无关紧要)。
因此,我要做的是在大于消息框宽度的单词前插入一个新行。这是代码:
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);
}
有两个问题。
- 算法在单词超出宽度之前将其换行 消息框。
最后几个词由于某种原因被跳过,当我使用 它像这样:
pro::message::display( App, "Hello World! Yada Yada Bla Bla Yda Yada Hehehe Hehe Hfmaf Heh last few words" );
它跳过最后一个词,词:
最佳答案
简单的解决方案是复制字符串,并在适当的时候用换行符替换空格。
你遇到的问题是,当你找到最后一个你应该换行的空间时,你仍然有文本没有被插入 vector 。您需要检查循环后是否还有更多文本,并将其添加为单独的一行。
关于c++ - 消息框中的字符串自动换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9129133/