关于MyGUI::TextBox中文自动换行的问题(一)
经过几次测试,得到的结论如下:
TextBox::SetCaption(UString&)不支持换行功能,即使你的参数包含"\n"或“\\n”
TextBox::SetCaptionWithReplacing(std::string&)支持换行功能,如果你的字符串包含“\\n”,内部逻辑会将其自动转换成"\n"
首先解决中文显示的问题:
当我们在代码中写诸如"This is String",系统默认视其为 char* 而不是 wchar_t*,而SetCaptionWithReplacing()只接受参数类型为string的参数。怎么办呢?我们可以先将其转为UString,然后用UString的operator std::string()强转:
UString::operator std::string() const { return std::string( asUTF8() ); }
这样,参数在传进来之前,实际上已经将其转化为 UTF-8 格式(这样就可以显示在UI上了)
MyGUI控件上能显示的中文字符都必须是宽字符(wchar_t*或wstring),这样就必须把char*转换为wchar_t*,或者把string转换为wstring,网上提供了很多种解决办法。这里用其中的一种,具体原理就不多说了,会在其它的帖子单独阐述宽窄字符以及各种中文编码格式的深入探讨
char* ansi_str = "这是中\n文字符!"; wchar_t* wstr = new wchar_t[ strlen(ansi_str)+1 ]; //设置全局locale为 "SimpleChinese" ,并保存返回值,作还原之用 std::locale old_locale = std::locale::global( std::locale("") ) ; mbstowcs( wstr , ansi_str , strlen(ansi_str) ) ; std::locale::global( old_locale ) ;//还原old_locale为系统locale //MyGUI自定义控件的使用方法这里略过...详见其它技术帖 MyGUI::TextBox* tbx = mTestTextBoxDlg->getTBx_Test(); MyGUI::UString ustr( wstr ); tbx->setCaption( ustr );
注意:这里最后用的是SetCaption(),一样显示出了换行的效果:
但是,如果这个字符是从文件中读取的话,即使文本中手动加了"\n",SetCaption也不能起到换行的作用
以前在用Java文件流的时候,也遇到过类似的情况:文件流中的字符和内存中的字符是不一样的(具体原理尚不清楚)
这时SetCaptionWithReplacing()就派上用场了:无论是从内存中还是从文件流中读取字符,都进行换行的替换。注意一定传UString进去,否则会导致内存分配失败(宽字符需要的内存字节数更多)
搞清楚换行处理的逻辑,后面就是需要搞清楚一行所占大小,根据它和控件长度做计算了
不早了,这个问题明天继续研究......