欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
相关标签: OSG