我在Windows下的OpenGL上下文中绘制文本,使用以下帮助函数,我从http://nehe.gamedev.net/tutorial/bitmap_fonts/17002/得到了:
GLvoid glPrint(HDC hDC, const char *fmt, ...) //Custom GL "Print" Routine
{
char text[256]; // Holds Our String
va_list ap; // Pointer To List Of Arguments
if (fmt == nullptr) // If There's No Text
return; // Do Nothing
va_start(ap, fmt); // Parses The String For Variables
vsprintf_s(text, fmt, ap); // And Converts Symbols To Actual Numbers
va_end(ap); // Results Are Stored In Text
glPushAttrib(GL_LIST_BIT); // Pushes The Display List Bits
glListBase(base - 32); // Sets The Base Character to 32
glCallLists((GLsizei)strlen(text), GL_UNSIGNED_BYTE, text); // Draws The Display List Text
glPopAttrib(); // Pops The Display List Bits
}
我通过调用
来定位文本glTranslatef(x, y, z);
glRasterPos2f(0.f, 0.f);
在glPrint
之前,其中x
,y
和z
是我希望将文字居中的点坐标。
这会从左下角开始绘制我的文字。如何将此文本置于其自身的质心中?
我尝试GetTextExtentPoint32
来定位我的文字,如下所示
SIZE extent;
GetTextExtentPoint32(hDC, SpinTools::string2wstring(text).c_str(), strlen(text), &extent);
glRasterPos2f(-extent.cx / 2, -extent.cy / 2);
但这不正确。
答案 0 :(得分:1)
我认为您对GetTextExtentPoint32的想法是正确的。但是这个futnction在屏幕空间中返回值,你需要将它转换为[-1..1] sapce。您可以尝试以下代码:glRasterPos2f((float)-extent.cx /(g_width),(float)-extent.cy /(g_height)); g_height和g_width是窗口的大小