OSG中LabelControl中文显示

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。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值