DelphiXe 使用OpenGL进行2D文字输出,乱码

ICMGDCHN 2012-10-19 05:50:27
如题,例如要输出‘1234’字符串,实际显示为1[]2[],怀疑是Unicode的原因,同样的代码用VC输出没问题,但DelphiXE找不到关闭Unicode的选项,VC则可通过宏UNICODE进行开关。
...全文
322 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ICMGDCHN 2012-10-22
  • 打赏
  • 举报
回复
OK了,谢谢。
结账。
蓝色光芒 2012-10-22
  • 打赏
  • 举报
回复

{$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;但是编译时有个警告,不安逸,所以转一下.
ICMGDCHN 2012-10-22
  • 打赏
  • 举报
回复
原来就是
glCallLists(Length(Text), GL_UNSIGNED_BYTE, pChar(text));

后来才改成
glCallLists(Length(Text), GL_UNSIGNED_BYTE, pAnsiChar(text));

一样不行。
蓝色光芒 2012-10-22
  • 打赏
  • 举报
回复
glCallLists(Length(Text), GL_UNSIGNED_BYTE, pAnsiChar(text));
改成这样试试,Delphi2010中,默认为Unicode的,
glCallLists(Length(Text), GL_UNSIGNED_BYTE, pChar(text));
ICMGDCHN 2012-10-22
  • 打赏
  • 举报
回复
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[]
hsfzxjy 2012-10-21
  • 打赏
  • 举报
回复
好像是默认的。。
hsfzxjy 2012-10-21
  • 打赏
  • 举报
回复
贴代码。。
内容概要:本文围绕“新型电力系统下多分布式电源接入配电网承载力评估方法”的研究,系统性地介绍了基于Matlab的仿真建模与代码实现方案,旨在评估高比例分布式电源(如光伏、风电等)接入背景下配电网的接纳能力。研究融合了智能优化算法(如蜣螂优化、灰狼优化、遗传算法)、多目标优化、鲁棒优化及双层优化模型,结合潮流计算、稳定性分析与故障仿真,构建了完整的承载力评估体系。文档不仅提供核心算法实现,还拓展至微电网调度、储能配置、电氢耦合系统、电动汽车协同等前沿方向,强调“复现+创新”相结合的科研路径,助力研究者快速掌握高水平论文复现技巧并激发原创思路。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,正在从事科研或工程应用的研究生及初级科研人员(工作1-3年);; 使用场景及目标:①复现高水平期刊中关于配电网承载力的优化模型;②开展高比例可再生能源接入下的配电网规划与运行研究;③学习并应用智能优化算法解决复杂电力系统问题;④获取完整科研资源包以加速课题进展与论文撰写; 阅读建议:建议读者关注公众号“荔枝科研社”获取网盘资源,下载全套代码与模型文件,按照文档结构循序渐进学习,重点理解算法设计逻辑与仿真建模细节,结合所提供的复现案例深化对优化模型与工程应用场景的理解,提升科研效率与创新能力。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧