OpenGL wgl中心文本

时间:2015-05-28 11:00:57

标签: c++ windows opengl mfc

我在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之前,其中xyz是我希望将文字居中的点坐标。

这会从左下角开始绘制我的文字。如何将此文本置于其自身的质心中?

我尝试GetTextExtentPoint32来定位我的文字,如下所示

SIZE extent;
GetTextExtentPoint32(hDC, SpinTools::string2wstring(text).c_str(), strlen(text), &extent);
glRasterPos2f(-extent.cx / 2, -extent.cy / 2);

但这不正确。

1 个答案:

答案 0 :(得分:1)

我认为您对GetTextExtentPoint32的想法是正确的。但是这个futnction在屏幕空间中返回值,你需要将它转换为[-1..1] sapce。您可以尝试以下代码:glRasterPos2f((float)-extent.cx /(g_width),(float)-extent.cy /(g_height)); g_height和g_width是窗口的大小