如题,例如要输出‘1234’字符串,实际显示为1[]2[],怀疑是Unicode的原因,同样的代码用VC输出没问题,但DelphiXE找不到关闭Unicode的选项,VC则可通过宏UNICODE进行开关。

解决方案 »

  1.   

    procedure TGLRender.GLNewFont;
    var
      font, oldfont:HFONT;
    begin
        fontbase:=glGenLists(128);     // 创建256个显示列表
        font:=CreateFontA(-10,      // 字体高度
                            0,      // 字体宽度
                            0,      // 字体的旋转角度
                            0,      // 字体底线的旋转角度
                            FW_BOLD,// 字体重量
                            0,  // 是否使用斜体
                            0,  // 是否使用下划线
                            0,  // 是否使用删除线
                            ANSI_CHARSET,   // 设置字符集
                            OUT_DEFAULT_PRECIS,  // 输出精度
                            CLIP_DEFAULT_PRECIS,    // 剪裁精度
                            DEFAULT_QUALITY,    // 输出质量
                            DEFAULT_PITCH,
                            'Courier New'{PChar(GConfig.FontName)}); // 字体名称
        oldfont:=HFONT(SelectObject(wglGetCurrentDC, font)); // 选择我们需要的字体
        wglUseFontBitmapsA(wglGetCurrentDC(), 0, 128, fontbase);     // 创建256个显示列表,绘制从ASCII码为32-128的字符
        SelectObject(wglGetCurrentDC(), oldfont);
        DeleteObject(font);
    end;procedure TGLRender.KillFont;
    begin
      glDeleteLists(fontbase, 128);
    end;procedure TGLRender.TextOut(x, y:double; const Text:string);
    begin
      glColor3f(1.0, 1.0, 1.0); // 颜色
      glRasterPos2d(x, y); // 输出位置
      glPushAttrib(GL_LIST_BIT);  // 把显示列表属性压入属性堆栈
      glListBase(fontbase);       // 设置显示列表的基础值
      glCallLists(Length(Text), GL_UNSIGNED_BYTE, pAnsiChar(text));  // 调用显示列表绘制字符串
      glPopAttrib();              // 弹出属性堆栈
    end;调用:
     TextOut(0, 0, '1234');输出:
     1[]2[]
      

  2.   

    glCallLists(Length(Text), GL_UNSIGNED_BYTE, pAnsiChar(text));
    改成这样试试,Delphi2010中,默认为Unicode的,
    glCallLists(Length(Text), GL_UNSIGNED_BYTE, pChar(text));
      

  3.   

    原来就是
    glCallLists(Length(Text), GL_UNSIGNED_BYTE, pChar(text));后来才改成
    glCallLists(Length(Text), GL_UNSIGNED_BYTE, pAnsiChar(text));一样不行。
      

  4.   


    {$IFDEF UNICODE}
    procedure UStrToAStr(var Dest : AnsiString; Const Sour : UnicodeString);
    asm
      MOV  ECX , DefaultSystemCodePage
      JMP  System.@LStrFromUStr
    end;
    {$ENDIF}procedure TGLRender.TextOut(x, y:double; const Text:string);
    var
      S : AnsiString;
    begin
    {$IFDEF UNICODE}
      UStrToAStr(S , Text);
    {$ELSE}
      S := Text;
    {$ENDIF}
    ....
    glCallLists(Length(S), GL_UNSIGNED_BYTE, Pointer(S));
    ....本来可以直接用S := Text;但是编译时有个警告,不安逸,所以转一下.