OpenGL和wglUseFontBitmaps只绘制等间距字母

Mic*_*ble 5 opengl winapi fonts

我使用wglUseFontBitmaps在OpenGL中绘制的字体为每个字母占用相等的空格(宽度),因此为"." 例如,需要与"M"一样多的空间.我已经改变了字体创建中的音高参数,VARIABLE_PITCH但它没有改变任何东西.它实际上可以用wglUseFontBitmaps完成,还是它的性质是每个生成的位图占用相等的空间?

另外我用GetTextExtentPoint32W()查询光栅位图文本的宽度/高度.返回的宽度还可以,但高度总是太大.我在黑色文本后面绘制一个明亮的矩形,使其在3d场景中始终可读.为什么被查询的高度如此之大?保留给更高级字符的空间是否像这样的"É"?

我的设置:

HFONT   font;                                       // Windows Font ID
font = CreateFont(  -12,                            // Height Of Font
        0,                              // Width Of Font
        0,                              // Angle Of Escapement
        0,                              // Orientation Angle
        FW_EXTRALIGHT,                      // Font Weight
        FALSE,                          // Italic
        FALSE,                          // Underline
        FALSE,                          // Strikeout
        ANSI_CHARSET,                   // Character Set Identifier
        OUT_TT_PRECIS,                  // Output Precision
        CLIP_DEFAULT_PRECIS,            // Clipping Precision
        ANTIALIASED_QUALITY,            // Output Quality
        FF_DONTCARE | VARIABLE_PITCH,       // Family And Pitch
        (LPCWSTR)L"Arial");             // Font Name

    SelectObject(this->hDeviceContext, font);

     //init display lists for text drawing
    bool createFontLists = wglUseFontBitmaps(this->hDeviceContext, 0, 255, 1000);
Run Code Online (Sandbox Code Playgroud)

Mic*_*ble 5

我自己解决了这个问题:它看起来只是字体用相等的空格或等宽字体绘制每个字母,但实际上OpenGL在每个字符之间画了一个空格.问题是std::wstring用于调用生成的displaylists wglUseFontBitmaps.错误的绘图看起来像这样:

int length = wcslen(text.c_str());
glCallLists (sizeof(wchar_t) * length, GL_UNSIGNED_BYTE, text.c_str());
Run Code Online (Sandbox Code Playgroud)

第一个参数(要调用的列表数)是错误的.它必须是length唯一的.第二个参数,告诉OpenGL如何将text.c_str中的每个字符解释为定义要调用的下一个显示列表的偏移号,这里是错误的.它必须是GL_UNSIGNED_SHORT,这是从0-65535的2Bytes.使用GL_UNSIGNED_BYTE,用于2字节字符的wstring中的第二个字节的每个'0'被解释为空格.所以正确的电话是:

glCallLists (length, GL_UNSIGNED_SHORT, text.c_str());
Run Code Online (Sandbox Code Playgroud)

这适用于我的情况,但不是使用wglUseFontBitmaps的unicode字符的一般方法.它只能安全​​地覆盖来自wstring的ASCII字符.