软件注册站
热情软件屋

 
OpenGL如何才能正确输出中文
编号: QA002062    
建立日期: 1999年11月21日 最后修改日期: 1999年12月2日
所属类别: C/C++ - 图形、图象
   
    OpenGL中输出文本有两个函数:
    wglUseFontBitmaps和wglUseFontOutlines,他们能输出2D或3D英文文本,但输出中文却出错。用逐个字符判断是否大于0xA0方法分别处理中、英文也不见效,请问如何才能正确输出中文?(杨穆)
   
    用OpenGL输出中文,必须使用TrueType字体,请参阅WGL的函数:
    BOOL wglUseFontOutlines(HDC hDC,DWORD....)
    有一本书《OpenGL深入编程与实例揭密》人民邮电出版,其中有这方面的详细介绍,建议您去买一本,相当不错。
    
    杨穆的来信:
    非常感谢ZhaoYu回答我的我的问题“如何用OPENGL显示中文”!
    现在我已完全解决了这个问题,现把具体代码寄给你:
     HFONT hFont;
     CFont *m_pFontSelected=NULL;
     LOGFONT lf ;
     memset(&lf,0,sizeof(LOGFONT));
     lf.lfHeight = -1 ;
     lf.lfWidth = -1 ;
     lf.lfEscapement = 0 ;
     lf.lfOrientation = 0 ;
     lf.lfWeight = FW_NORMAL ;
     lf.lfItalic = FALSE ;
     lf.lfUnderline = FALSE ;
     lf.lfStrikeOut = FALSE ;
     lf.lfCharSet = ANSI_CHARSET ;
     lf.lfOutPrecision = OUT_TT_PRECIS ;
     lf.lfClipPrecision= CLIP_DEFAULT_PRECIS ;
     lf.lfQuality = PROOF_QUALITY ;
     lf.lfPitchAndFamily = VARIABLE_PITCH | TMPF_TRUETYPE | FF_MODERN ;
     lstrcpy (lf.lfFaceName, "Arial") ;
    
     CDC *pdc = new CClientDC(this);
     m_pFontSelected = new CFont;
     m_pFontSelected->CreateFontIndirect(&lf) ;
     CFont* pOldFont = (CFont*)pdc->SelectObject(m_pFontSelected) ;
     hFont = CreateFontIndirect(&lf);
     //设置当前字体
     pOldFont = (CFont*)SelectObject(wglGetCurrentDC(),hFont);
     GLYPHMETRICSFLOAT agmf[128];
     unsigned int ich=0;
     unsigned int j=0;
     char COText[128];
     BYTE FTextList[128];
     char cch;
     const GLuint FListBase=1000;
     unsigned int i=0;
    
     strcpy(COText,"字体显示");
     i=0;
     j=0;
     while(i     if (IsDBCSLeadByte(COText[i])){ ///判断是否为双字节
     ich=COText[i];
     ich=(ich<<8)+256; ////256为汉字内码“偏移量”
     ich=ich+COText[i+1];
     i++;i++;
     wglUseFontOutlines(wglGetCurrentDC(), /////字体轮廓设备联系DC
     ich, /////要转换为显示列表的第一个字符
     1, /////要转换为显示列表的字符数
     1000+j, /////显示列表的基数
     0.0f, /////指定与实际轮廓的最大偏移量
     0.15f, /////在Z轴负方向的值
     WGL_FONT_POLYGONS, /////指定显示列表线段或多边形
     &agmf[j]); /////接受字符的地址
     FTextList[j]=j;
     j++;
     }
     else{
     cch=COText[i];
     i++;
     wglUseFontOutlines(wglGetCurrentDC(), /////字体轮廓设备联系DC
     cch, /////要转换为显示列表的第一个字符
     1, /////要转换为显示列表的字符数
     1000+j, /////显示列表的基数
     0.0f, /////指定与实际轮廓的最大偏移量
     0.15f, /////在Z轴负方向的值
     WGL_FONT_POLYGONS, /////指定显示列表线段或多边形
     &agmf[j]); /////接受字符的地址
     FTextList[j]=j;
     j++;
     }
     }
     glListBase(FListBase);
     glTranslatef(-1.2f,-0.0f,0); ////要显示的文本位置
     glCallLists(strlen(COText),GL_UNSIGNED_BYTE,&FTextList);
     glFlush();
    
    @!P相关书籍:
    《OpenGL图形程序设计指南》
    《OpenGL(R) 编程权威指南 第三版》
    《OPENGL 程序设计 配光盘 》
    《OPENGL图形程序设计及应用环境》
    《精通OPENGL》

    

此问题由Zhao Yu回答。

附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, 图形、图象, picture, graph, image, draw

   
 
把这个问题推荐给朋友
   
 
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio