- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个用 Visual C++ 6 编写的旧应用程序。这个应用程序的一部分是将文本绘制到位图中。这在 Windows XP 上运行良好,但当相同的代码在 Windows 7 上运行时,所有文本在 ASCII 表中移动一个位置。
例如,"Category"
变为 "B'sdfnqx"
。
知道是什么原因造成的以及如何解决吗?
编辑:抱歉,以上内容略有不正确。当我在代码中看到 DrawText 函数时,我认为它是 GDI 函数。当我进入它时,发现作者使用 OpenGL
创建了他们自己的 DrawText
函数。我不知道任何 OpenGL
所以现在已经失控了。它调用 glCallLists
将文本(存储在 CString
中)传递给此函数。
下面是完整的类代码。注意:是DrawText函数中的glCallLists函数引起的问题。
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;
}
现在我根本不了解 openGL,但我假设 glCallLists
只是将字符串重新解释为字节数组,Windows XP 和 Windows 7 之间存在问题。也许一个unicode问题或什么?可能是 32 位 Windows 操作系统与 64 位操作系统?
这现在是否显示出更明显的问题?
最佳答案
这一行显然没有按照它的评论所说的去做:
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 会崩溃。
更好的解决方法是实际只生成可打印的字符,如随附的评论所建议的那样。如果其中一台计算机缺少非打印字符,您将不会遇到问题。
关于c++ - OpenGL glCallLists 在 Windows 7 上绘制不正确的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10782067/
我是 OpenGL 的新手。在了解 OpenGL 显示列表之前,我编写了一个程序。到目前为止,很难利用它们,因为我的代码之间到处都包含许多非“gl”行。所以我很好奇我在性能上损失了多少.. 最佳答案
glCallLists()是渲染一系列显示列表的便捷函数,尤其是文本渲染之类的东西。我很好奇 - 调用 glCallLists() 实际上更有效,还是仅仅是一个方便的函数?例如,这两个片段中的哪一个可
所以我的显示列表有一堆地址。我可以做到这些,并使用 GL11.glCallList(address) 轻松地将它们显示在屏幕上。我的问题是我不知道如何使用可能更高效的 GL11.glCallLists
每当我绘制显示列表时,我光滑的实用程序文本都无法正确呈现。 使用 glCallList 时: 不使用 glCallList: 渲染显示列表: if (dlLocation != -1) {
我有一个用 Visual C++ 6 编写的旧应用程序。这个应用程序的一部分是将文本绘制到位图中。这在 Windows XP 上运行良好,但当相同的代码在 Windows 7 上运行时,所有文本在 A
我有一个简单的 OpenGL 应用程序,我在屏幕上显示了 2 个对象: 1) 粒子系统,其中每个粒子都使用 glTexImage2D() 调用进行纹理映射。在 drawEvent 函数中,我将其绘制为
我遇到了一些应该同时使用 glfw3 和 OpenMP 的代码的问题(顺便说一句,在 OSX 上使用 g++ 5.3.0)。这是我一直致力于编写的一些数学软件的简化版,到目前为止似乎进展顺利。代码本身
我是一名优秀的程序员,十分优秀!