DelphiXe 使用OpenGL进行2D文字输出,乱码 如题,例如要输出‘1234’字符串,实际显示为1[]2[],怀疑是Unicode的原因,同样的代码用VC输出没问题,但DelphiXE找不到关闭Unicode的选项,VC则可通过宏UNICODE进行开关。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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[] glCallLists(Length(Text), GL_UNSIGNED_BYTE, pAnsiChar(text));改成这样试试,Delphi2010中,默认为Unicode的,glCallLists(Length(Text), GL_UNSIGNED_BYTE, pChar(text)); 原来就是glCallLists(Length(Text), GL_UNSIGNED_BYTE, pChar(text));后来才改成glCallLists(Length(Text), GL_UNSIGNED_BYTE, pAnsiChar(text));一样不行。 {$IFDEF UNICODE}procedure UStrToAStr(var Dest : AnsiString; Const Sour : UnicodeString);asm MOV ECX , DefaultSystemCodePage JMP System.@LStrFromUStrend;{$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;但是编译时有个警告,不安逸,所以转一下. delphi dbtreeview 小问题 急!!! Delphi2010设置 寻求一个课程表的显示控件!! 一个 Delphi 的群:13830859 简单的判断问题 请教一个SQL的问题 ***寻求以下正版软件的报价,请大家支持!*** 我想做個人主頁.哪位老兄行行好.給我個免費的主頁空間 对delphi程序中的数据库文件进打包后,为何在别的计算机上运行不了? delphi2007+Sqlite3+tz控件 存储二进制数据问题 在线等++++ 把SQL中的图片导出到EXCEL excel comojb 操作问题!
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[]
改成这样试试,Delphi2010中,默认为Unicode的,
glCallLists(Length(Text), GL_UNSIGNED_BYTE, pChar(text));
glCallLists(Length(Text), GL_UNSIGNED_BYTE, pChar(text));后来才改成
glCallLists(Length(Text), GL_UNSIGNED_BYTE, pAnsiChar(text));一样不行。
{$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;但是编译时有个警告,不安逸,所以转一下.