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 _strLon;
_strLon = "经度:";
std::string _strWideLon;
gb2312ToUtf8(_strLon,_strWideLon);
std::string _strLat;
_strLat = "纬度:";
std::string _strWideLat;
gb2312ToUtf8(_strLat,_strWideLat);
std::string _strele;
_strele = "高程:";
std::string _strWideele;
gb2312ToUtf8(_strele,_strWideele);
std::string _strScale;
_strScale = "比例尺:";
std::string _strWideScale;
gb2312ToUtf8(_strScale,_strWideScale);
上述2步与网上的是一样的,其实大家只需要定制自己的第3步就行,网上定制我都看了一下,大部分都一样,都是再osgearth的那个球上打印的北京或者中国之类的,这里我不是在球上打印,而是单独在旁边定义一个LabelControl,把中文打印在LabelControl上面。
3.最重要的是第3步,这里有2点。(1)找到中文显示的文件,大家可以在自己的计算机上找到一个名为simsum.ttc的文件,应该是在系统的字体文件夹下面,可以通过计算机搜索出来,然后通过readFontFile读取这个文件的路径,注意区分单斜杠与双斜杠,或者把这个文件复制到自己的工程下面。(2)指定字体为UTF8即可。代码如下:
LabelControl* label1 = new LabelControl(_strWideLon);
label1->setFont( osgText::readFontFile( "simsun.ttc" ) );
// label1->setFontSize( 24.0f );
label1->setEncoding(osgText::String::ENCODING_UTF8);
LabelControl* label2 = new LabelControl(_strWideLat);
label2->setFont( osgText::readFontFile( "simsun.ttc" ) );
// label2->setFontSize( 24.0f );
label2->setEncoding(osgText::String::ENCODING_UTF8);
LabelControl* label3 = new LabelControl(_strWideele);
label3->setFont( osgText::readFontFile( "simsun.ttc" ) );
// label3->setFontSize( 24.0f );
label3->setEncoding(osgText::String::ENCODING_UTF8);
LabelControl* label4 = new LabelControl(_strWideScale);
label4->setFont( osgText::readFontFile( "simsun.ttc" ) );
// label4->setFontSize( 24.0f );
label4->setEncoding(osgText::String::ENCODING_UTF8);
总结起来:3步走,前面2步是通用的,主要步骤是根据自己的需求定制第3步即可,定制就需要解决2个问题,(1)指定中文文件路径。(2)指定字体格式为UTF8。