【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 4237|回复: 12

[求助]使用ID3DXFont显示字,但是有些字显示不出来

[复制链接]
发表于 2007-1-29 13:49:54 | 显示全部楼层 |阅读模式

一直用ID3DXFONT显示字体,但是突然发现有时候在某些机上不定时的有些字显示不出来,不如说“我爱你”就会显示成“我  你”,“222”就会显示成“2 2”,调试的时候发现在内存中这些字符串都是完整的,就是显示在屏幕上的时候少那么几个字~~~~而且少的几个字有很大的概率都是那么几个字`~~~~这个问题困扰了好久,实在没有办法了,还请大家指教

PS:我的输出函数是用的ID3DXFONT里面的DRAWTEXT成员函数。

下面是代码片段:

LPD3DXFONT pFont;

 D3DXFONT_DESC pDesc;
 pDesc.Height = 14;
 pDesc.Width = 7;
 pDesc.Weight = 20;
 pDesc.Italic = false;
 pDesc.CharSet = DEFAULT_CHARSET;
 strcpy(pDesc.FaceName,"宋体");

 D3DXCreateFontIndirect(g_pd3dDevice,&pDesc,&pFont);

RECT Rt={0,0,100,100};

CString Context="我爱你";(此处换成char context[]="我爱你";依然会有字显示不出来)

int Length = Context.GetLength();(此处换成int Length = -1;依然会有字显示不出来) 

pFont->DrawTextA( NULL,Context, Length, &Rt,
   DT_CENTER|DT_VCENTER,D3DCOLOR_ARGB(255,255,255,255) );

发表于 2007-1-29 13:56:47 | 显示全部楼层

这个函数我用过没有发现类现象~是不是你的字库有缺?换几个字体也是这几个字不显示吗?

还有就是你应该总结一下这几个显示有问题的及其机器有什么特征。

[此贴子已经被作者于2007-1-29 14:29:13编辑过]
 楼主| 发表于 2007-1-29 14:00:09 | 显示全部楼层

他也不是那几个字一定不显示,只是那几个字在我的实验的过程中会经常不显示,当然他们还是有显示的时候,所以应该不是字库缺吧~~~~~

不过我还没有换字体实验过,试试看

 楼主| 发表于 2007-1-29 14:26:38 | 显示全部楼层

刚才实验过了,换了字体还是会有字显示不出来~~~~~[em07]

PS:如果我想给程序指定字库文件的位置,应该怎么做

发表于 2007-1-29 14:38:15 | 显示全部楼层

你把代码发给我 m9551@163.com

具体制定字体库位置我没做过,不过见过一些游戏是吧自己的字体放在游戏目录里面了,你可以尝试的去做一下

 楼主| 发表于 2007-1-29 14:58:21 | 显示全部楼层
主要是因为我的工程是几个人合作做的,属于比较大的那种,实在没有办法全部发给你啊~~~~主要的代码都已经贴在上面了~~~~[em07]
发表于 2007-1-29 15:33:49 | 显示全部楼层
我的原来有的代码没在身边,晚上我看看有什么不一样的地方。
 楼主| 发表于 2007-1-29 16:03:50 | 显示全部楼层
好的,谢谢老大了,这个问题郁闷了N久~~~~对了,我用的是DX9 August 2005 SDK
发表于 2007-1-30 13:54:34 | 显示全部楼层

不好意思~~昨晚上帮朋友下副本....

//-----------------------------------------------------------------------------
// 字体初始化
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitFont ()
{
 ZeroMemory(&d3dFont, sizeof(d3dFont));
 //初始化字体
 d3dFont.Width = 8;    //字体高度
 d3dFont.Height= 16;    //字体宽度
 d3dFont.Weight= 10;    //字体胖度
 //d3dFont.lfItalic=false;  //斜体
 //d3dFont.lfUnderline=false; //下划线
 //d3dFont.lfStrikeOut =false; //粗体
 d3dFont.CharSet =DEFAULT_CHARSET;
 strcpy(d3dFont.FaceName, "宋体");
 D3DXCreateFontIndirect(g_pd3dDevice, &d3dFont, &g_ppFont);
 
 return S_OK;
}

//-----------------------------------------------------------------------------
// 文字显示
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
VOID DrawText(char* Text)
{
 RECT re_font;
 SetRect( &re_font,0,0,100,1000);
 char show_time[8] = "我爱你";
  g_ppFont->DrawTextA(g_pSprite,show_time,-1,&re_font,DT_TOP|DT_CENTER,0xffFFFFFF);
}


以上就是完整字体初始化和显示的函数,我使用很多的程序都套用这个代码,没用出现过问题,支持SDK 9.0C以上版本
 楼主| 发表于 2007-1-30 16:34:52 | 显示全部楼层
刚才按照你的代码试过了,依然不行,还是随机出现,不过也是有规律的,就是固定在某几台机器上出现,某些句子会有,而其他句子却一次也没有出现~~~~~失败啊`~~[em07]
发表于 2007-1-31 09:33:27 | 显示全部楼层
不是说了么~~总结一下这几台机子的特征,主要是软件环境的特征,比如操作系统版本,DIX的版本,还有你们的编辑器的版本等..找找规律,一定能找到原因的.
发表于 2007-6-2 21:34:12 | 显示全部楼层
用WCHAR 试一下
发表于 2007-2-3 21:14:28 | 显示全部楼层

让我来告诉你吧

把“pFont->DrawTextA”换成“pFont->DrawTextW”,就可以啦,是DX9的版本问题,还有你如果用的是汉字的话最好是用“pFont->DrawTextW”

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 04:09

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表