OpenGL glCallLists Drawing invalid characters in Windows 7

I have an old application written in Visual C ++ 6. Part of this application draws text into a bitmap. This works fine in Windows XP, but when the same code runs in Windows 7, all text is shifted by one place in the ASCII table.

For example, "Category"it becomes "B'sdfnqx".

Any ideas what causes this and how to fix it?

Edit: Sorry, but the above is a bit wrong. When I saw the DrawText function in the code, I assumed that it was a GDI function. When I enter it, it turns out that the author created his own function DrawTextthat uses OpenGL. I don't know anyone OpenGL, so now he's out of control. It calls glCallListsthat passes the text (stored in CString) to this function.

Full class code below. Note. This glCallLists function in the DrawText function is causing the problem.

OGLFontClass::OGLFontClass()
{
    m_id = -1;
}

OGLFontClass::~OGLFontClass()
{
    Clear();
}

void OGLFontClass::Clear()
{
    if( m_id != -1 )
    {
        glDeleteLists(m_id,255);
        m_id = -1;
    }
}

void OGLFontClass::Initialise(CString fontname, int size, HDC hDC)
{
    m_HDC = hDC;
    m_id = glGenLists(255);
    ::DeleteObject( m_FONT );

    m_FONT = CreateFont(    -size,              // Height Of Font ( NEW )
                            0,              // Width Of Font
                            0,              // Angle Of Escapement
                            0,              // Orientation Angle
                            FW_NORMAL,          // 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|DEFAULT_PITCH,  // Family And Pitch
                            fontname);          // Font Name

    HFONT oldfont = (HFONT)SelectObject(hDC, m_FONT);       // Selects The Font We Want
    wglUseFontBitmaps(hDC, 0, 255, m_id );          // Builds 96 Characters Starting At Character 32
    ::SelectObject( hDC, oldfont );
}

void OGLFontClass::DrawText( float x, float y, CString str )
{
    glRasterPos3f(x,y, 0);

    glPushAttrib(GL_LIST_BIT);
        glListBase(m_id);
        glCallLists(str.GetLength(), GL_UNSIGNED_BYTE, str.GetBuffer(0));
    glPopAttrib();
}

void OGLFontClass::DrawText(int x, int y, int r, int g, int b, CString text)
{
    glMatrixMode(GL_PROJECTION);

    glPushMatrix();
    glLoadIdentity();// Reset The View

    HWND hWnd = ::WindowFromDC(wglGetCurrentDC() );

    RECT rc;
    ::GetClientRect( hWnd, &rc );

    int CX = rc.right;//::GetSystemMetrics( SM_CXSCREEN );
    int CY = rc.bottom;//::GetSystemMetrics( SM_CYSCREEN );

    gluOrtho2D (0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN), 0);

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    glColor3ub(r,g,b);  

    glRasterPos2d( x, y );   // had to do this to get the text to line up where i want it

    //glDisable(GL_TEXTURE_2D);

    glPushAttrib(GL_LIST_BIT);      // Pushes The Display List Bits     ( NEW )
    glListBase(m_id);               // Sets The Base Character to 32    ( NEW )

    unsigned char* szTemp = new unsigned char[text.GetLength()+1];
    strcpy((char*)szTemp, text);

    glCallLists(strlen((char*)szTemp), GL_UNSIGNED_BYTE, szTemp);   // Draws The Display List Text  ( NEW )

    delete[] szTemp;

    glPopAttrib();                      // Pops The Display List Bits   ( NEW )

    glPopMatrix();

    glMatrixMode(GL_PROJECTION);

    glPopMatrix();

    glMatrixMode(GL_MODELVIEW);
}

void OGLFontClass::DrawRightText( int x, int y, int r, int g, int b, CString text )
{
    glMatrixMode(GL_PROJECTION);

    glPushMatrix();
    glLoadIdentity();// Reset The View

    HWND hWnd = ::WindowFromDC(wglGetCurrentDC() );

    RECT rc;
    ::GetClientRect( hWnd, &rc );

    float CX = (float)::GetSystemMetrics( SM_CXSCREEN );
    float CY = (float)::GetSystemMetrics( SM_CYSCREEN );
    float fMultiplier = CX / CY;

    gluOrtho2D (0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN), 0);

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    int nPos = x;

    glColor3ub(r,g,b);  
    //glDisable(GL_TEXTURE_2D);

    glPushAttrib(GL_LIST_BIT);      // Pushes The Display List Bits     ( NEW )

    glListBase(m_id);               // Sets The Base Character to 32    ( NEW )

    for( int i = text.GetLength() - 1; i >= 0; i-- )
    {
        CString sChar = text.GetAt(i);

        glRasterPos2d(nPos,y);   // had to do this to get the text to line up where i want it
        glCallLists(1, GL_UNSIGNED_BYTE, sChar);    // Draws The Display List Text  ( NEW )

        if ( i > 0 )
        {
            CString sNextChar = text.GetAt(i-1);

            SIZE szWidth = GetTextExtent(sNextChar);
            szWidth.cx += 1;
            szWidth.cx *= fMultiplier;
            szWidth.cx += 1;

            nPos -= szWidth.cx;
        }
    }

    //glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);    // Draws The Display List Text  ( NEW )

    glPopAttrib();                      // Pops The Display List Bits   ( NEW )

    glPopMatrix();

    glMatrixMode(GL_PROJECTION);

    glPopMatrix();

    glMatrixMode(GL_MODELVIEW);

}

CSize OGLFontClass::GetTextExtent(CString text, float fFactor)
{
    SIZE sz;
    HFONT oldfont = (HFONT) SelectObject(m_HDC, m_FONT);
    GetTextExtentPoint32(m_HDC,text,strlen(text),&sz);

    SelectObject(m_HDC, oldfont);

    sz.cx *= 0.2;
    sz.cy *= 0.2;

    return sz;
}

Now I don’t know openGL at all, but I assume that since it glCallListsjust reinterprets the string as an array of bytes, something is wrong with Windows XP and Windows 7. Perhaps a problem with unicode or something else? Perhaps a 32-bit Windows OS or a 64-bit OS?

?

+5
4

, :

wglUseFontBitmaps(hDC, 0, 255, m_id );          // Builds 96 Characters Starting At Character 32

:

glListBase(m_id);               // Sets The Base Character to 32    ( NEW )

, m_id , .

glListBase(m_id+1);

, Windows 7. XP .

, . , .

+1

XP Windows 7. opengl32.dll ( grahpicscard, , RDP), glCallLists() glNewList/glEndList.

. Lession 13 von NeHe http://nehe.gamedev.net/tutorial/bitmap_fonts/17002 glPrint(), , ASCII, . ( Windows 7 RDP)

GLvoid glPrint(const char *fmt, ...)                    // Custom GL "Print" Routine
{
    char        text[256];                              // Holds Our String
    va_list     ap;                                     // Pointer To List Of Arguments

    if (fmt == NULL)                                    // If There 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

    //first text line
    glRasterPos2f(-0.8f, 0);
    GLuint List1 = glGenLists (1);
    glNewList(List1, GL_COMPILE);
      glPushAttrib(GL_LIST_BIT);                            // Pushes The Display List Bits
      glListBase(base1);                                // Sets The Base Character to 32
      glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);    // Draws The Display List Text
      glPopAttrib();                                        // Pops The Display List Bits
    glEndList();
    glCallList(List1);

    //second text line
    glRasterPos2f(-0.8f, -0.2f);
    glPushAttrib(GL_LIST_BIT);                          // Pushes The Display List Bits
    glListBase(base1);                              // Sets The Base Character
    glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);  // Draws The Display List Text
    glPopAttrib();                                      // Pops The Display List Bits

}

: http://www.opengl.org/sdk/docs/man2/xhtml/glNewList.xml glCallList glCallLists . , glCallList glCallLists, , GL_COMPILE_AND_EXECUTE.

0

Windows XP, Windows 7 ASCII.

opengl32.dll Windows 7 Windows 8 glNewList/glEndList

. "glCallLists (strlen (), GL_UNSIGNED_BYTE, );

:

"" opengl32.dll XP (windows\system32)

0
source

All Articles