|
Context c = renderer.m_context;
point_size = MulDiv(size, GetDeviceCaps(c, LOGPIXELSY), 72);
HFONT font = 0;
if (font_size_lookup[in_size] == 0)
{
// Set up the LOGFONT structure
LOGFONT logical_font;
logical_font.lfHeight = get_point_size(); //以逻辑单位指定字体字符元或字符高度
logical_font.lfWidth = 0; //以逻辑单位指定字体字符的平均宽度,如果lfWidth的值为0,则根据设备的纵横比从可用字体的数字转换纵横中选取最接近的匹配值
logical_font.lfEscapement = 0; //以十分之一度为单位指定每一行文本输出时相对于页面底端的角度
logical_font.lfOrientation = 0; //以十分之一度为单位指定字符基线相对于页面底端的角度
logical_font.lfWeight = FW_NORMAL; //指定字体重量。在Windows中,字体重量这个术语用来指代字体的粗细程度
logical_font.lfItalic = false; //当lfItalic为TRUE时使用斜体
logical_font.lfUnderline = false; //当lfUnderline为TRUE时给字体添加下划线
logical_font.lfStrikeOut = false; //当lfStrikeOut为TRUE时给字体添加删除线
logical_font.lfCharSet = ANSI_CHARSET; //指定字符集
logical_font.lfOutPrecision = OUT_DEFAULT_PRECIS; //指定输出精度
logical_font.lfClipPrecision = CLIP_DEFAULT_PRECIS;//指定剪辑精度
logical_font.lfQuality = PROOF_QUALITY; //定义输出质量
logical_font.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;//指定字体的字符间距和族
lstrcpy(logical_font.lfFaceName, fontname.c_str());
font = CreateFontIndirect(&logical_font);
HFONT previous_font = (HFONT)SelectObject(c, font);
wglUseFontBitmapsW(c, 0, 128, next_call_list_start);
font_size_lookup[in_size] = next_call_list_start;
font_handle_lookup[in_size] = font;
next_call_list_start += 130;
SelectObject(c, previous_font);
}
TextWriter& Text: perator<<(TextWriter& tw) const
{
int draw_x;
int draw_y;
calculate_position_and_advance_cursor(tw, &draw_x, &draw_y);
// TODO: This isn't Unicode!
std::string narrow(m_text.begin(), m_text.end());
glBindTexture(GL_TEXTURE_2D, 0);
glPushMatrix();
tw.renderer.SetColor(m_color);
glListBase(font_size_lookup[tw.size]);
glRasterPos2i(draw_x, draw_y + tw.size);
glCallLists(static_cast<int>(narrow.length()), GL_UNSIGNED_BYTE, narrow.c_str());
glPopMatrix();
// TODO: Should probably delete these on shutdown.
//glDeleteLists(1000, 128);
return tw;
}
这段代码只能实现ASCLL的128的字符的编码显示,我想要显示中文,
将指定字符集改成logical_font.lfCharSet = GB2312_CHARSET;添加字符显示列表wglUseFontBitmapsW(c, 0, 65535(这里超级浪费因为没用几个汉字), next_call_list_start(这个宏定义是1));显示的时候改成
glCallLists(static_cast<int>(narrow.length()), GL_UNSIGNED_SHORT, narrow.c_str());
还是只能显示少量错误的汉字,而且有很多不认识的字,字符串明显变长了,可能是/0被当成某个双字节字符的其中一个字节显示了,求助要怎么改
|
|