OSG中LabelControl中文显示
程序员文章站
2022-06-10 21:09:49
...
OSG默认是不支持中文显示的,然而在有些时候还是需要中文显示的,对于OSG的中文显示,网上有很多的解决方案,但是我没有找到关于LabelControl的显示,这里我把关于LabelControl的中文显示分享一下。
OSG的中文显示大致来说可以分为3步,我这里的前2步就是参考网上的解决方案,没有什么特别的。
1.定义转换函数。
void unicodeToUTF8(const std::wstring &src, std::string& result)
{
int n = WideCharToMultiByte( CP_UTF8, 0, src.c_str(), -1, 0, 0, 0, 0 );
result.resize(n);
::WideCharToMultiByte( CP_UTF8, 0, src.c_str(), -1, (char*)result.c_str(), result.length(), 0, 0 );
}
void gb2312ToUnicode(const std::string& src, std::wstring& result)
{
int n = MultiByteToWideChar( CP_ACP, 0, src.c_str(), -1, NULL, 0 );
result.resize(n);
::MultiByteToWideChar( CP_ACP, 0, src.c_str(), -1, (LPWSTR)result.c_str(), result.length());
}
void gb2312ToUtf8(const std::string& src, std::string& result)
{
std::wstring strWideChar;
gb2312ToUnicode(src, strWideChar);
unicodeToUTF8(strWideChar, result);
}
2.转换需要转换的字符。
std::string _chineseExample;
_chineseExample = "中文示例";
std::string _writeChineseExample;
gb2312ToUtf8(_chineseExample,_writeChineseExample);
3.写入想要显示的地方,我这边是LabelControl
经过测试发现问题,需要设置编码和文字格式
std::string _chineseExample;
_chineseExample = "中文示例";
std::string _writeChineseExample;
gb2312ToUtf8(_chineseExample,_writeChineseExample);
LabelControl* label = new LabelControl(_writeChineseExample + "osgEarth Controls Toolkit");
label->setFontSize(24.0f);
label->setHorizAlign(Control::ALIGN_CENTER);
label->setMargin(5);
label->setFont(osgText::readFontFile("data//simsun.ttc"));
label->setEncoding(osgText::String::ENCODING_UTF8);
center->addControl(label);