我想在opengl中绘制一些中文字符,教程给了我以下代码(我修改了一些部分)
GLvoid showText(int x, int y, const char* text) {
glRasterPos2f(x, y);
HDC hdc = wglGetCurrentDC();
HFONT g_font = CreateFont(
-16,
0,
0,0,FW_BOLD,0,0,0,GB2312_CHARSET,OUT_TT_PRECIS,0,ANTIALIASED_QUALITY ,0, "楷体"
);
SelectObject(hDC, g_font);
// get the length of text
int wlen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, text, -1, NULL, 0);
--wlen; // remove duplicated '\0'
wchar_t* wstring = (wchar_t*)malloc((wlen+1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, text, -1, wstring, wlen); // All to 2byte-char
wstring[wlen] = L'\0';
GLuint base;
base = glGenLists(1);
for(i=0; i<wlen; ++i) {
if (! wglUseFontBitmapsW(hDC, wstring[i], 1, base)) {
DWORD err = GetLastError();
printf("%d\n", err);
}
glCallList(base);
}
// release resources
glDeleteLists(base, 1);
DeleteObject(g_font);
}
然后我用以下代码测试它:
glNewList(g_lists, GL_COMPILE_AND_EXECUTE);
glColor3f(0, 0, 1);
showText(-110, 110, "滴滴答答呱呱呱刷刷怕");
showText(100, -110, "嘎嘎嘎asawhaga了");
glColor3f(1, 0, 1);
glBegin(GL_LINES);
glVertex2f(300, 0);
glVertex2f(-300, 0);
glEnd();
glEndList();
输出: 它应该是:
“滴滴答答呱呱呱刷刷怕”
“嘎嘎嘎asawhaga了”
但我得到了:
“滴答答呱呱呱刷刷怕”
“嘎嘎嘎asawhaga了”
正如你所看到的,第二个“滴”从输出中消失了。 通过打印出调试信息,我发现对wglUseFontBitmapsW()的第二次调用返回false。 根据{{3}},我将通过调用GetLastError()获得错误描述,但GetLastError只返回0。 然后我试了一下:
if (! wglUseFontBitmapsW(hDC, wstring, 1, base))
wglUseFontBitmapsW(hDC, wstring, 1, base);
这次它有效! 所以我现在不知道我的代码有什么问题...... 可能带有重量的设置:
#ifdef UNICODE
#undef UNICODE
#endif
#define bool BOOL
#define BITS 32
MSDN,修改自Nehe的教程 我在使用Windows 7的mingw-gcc 4.7.0下编译它