初学Direct X(9) ——文字的显示

初学Direct X(9)

——文字的显示

本次学习如何使用ID3DXFont创建字体,使得我们可以在任何安装了Windows系统中TrueType字体来打印文字,不过最好使用标准字体,这样文字在每一台PC上的显示才会和计划中的一样。

1. 显示前的准备

就像创建LPDIRECT3DDEVICE9一样,我们需要先声明一个接口:

LPD3DXFONT font = NULL;

接着设置创建字体所需要的参数:

typedef struct _D3DXFONT_DESCA
{
    INT Height;
    UINT Width;
    UINT Weight;
    UINT MipLevels;
    BOOL Italic;
    BYTE CharSet;
    BYTE OutputPrecision;
    BYTE Quality;
    BYTE PitchAndFamily;
    CHAR FaceName[LF_FACESIZE];

} D3DXFONT_DESCA, *LPD3DXFONT_DESCA;

不用害怕,这里面的大多数参数都是可以设置为默认值的,但是也有几个是我们真正需要的,诸如HeightFaceName,它们分别控制着字体的大小和类型。以下是一个创建示例:

D3DXFONT_DESC desc = {
	24,	// Height
	0,
	0,
	0,
	false,
	DEFAULT_CHARSET,
	OUT_TT_PRECIS,
	CLIP_DEFAULT_PRECIS,
	DEFAULT_PITCH,
	"Arial" // FaceName
};

有了创建所需要的参数,下面就是开始创建字体对象了,可以发现它需要三个参数:

1)Direct3D设备:以便将设备与字体关联起来
2)D3DXFONT_DESC
3)LPD3DXFONT

HRESULT D3DXCreateFontIndirectA( 
        LPDIRECT3DDEVICE9       pDevice, 
        CONST D3DXFONT_DESCA*   pDesc, 
        LPD3DXFONT*             ppFont);

以下是一个调用示例:

D3DXCreateFontIndirect(d3ddev,&desc,&font);

到这就完成了显示字体钱所需要的一切了。

2. 显示文字

使用ID3DXFont::DrawText可以打印文字到屏幕上:

INT DrawText(
  [in] LPD3DXSPRITE pSprite,
  [in] LPCTSTR      pString,
  [in] INT          Count,  
  [in] LPRECT       pRect, 
  [in] DWORD        Format,  
  [in] D3DCOLOR     Color
);

pSprite:可以为NULL,不过为了提高程序运行效率最好事先声明
Count:文本的长度
pRect:显示区域
Format:文本的格式化,比如DT_RIGHT,它可以使得文本右对齐显示,详细的可以参照文档

在MSDN的文档中可以看到ID3DXFont::DrawText是支持ANSI以及Unicode的字符串的,即支持中文。

在设置相关参数之后,让我们看看调用的示例:

RECT rect;
rect = { 0, 0, 100, 100 };
color = D3DCOLOR_XRGB(255, 255, 255);
string text = "我皮一下挺开心";

// ... 

font->DrawTextA(spriteobj,text.c_str(),text.length(),&rect,DT_CENTER,color);

显示效果如图1所示:

图1
图1

3. 文字折行显示

如果我要输出的文字足够多,多到大于pRectwidth,那么会出现什么情况呢?由于文字一行太长,于是就显示不出来了,就想图2这样:
图2
图2

解决方法有如下两种:

1)手动折行
2)动态折行

3.1 手动折行

将要输出文字中需要折行位置添加' ':

string text = "我皮一下挺开心1,
我皮一下挺开心2,
我皮一下挺开心3,
我皮一下挺开心4,
我皮一下挺开心5,
我皮一下挺开心6,
我皮一下挺开心7。";

其他不需要改动,效果如图3所示,由于受制于pRectheight的影响,没有全部显示:

图3
图3

3.2 动态折行

这只需要在DrawTextAFormat传为DT_WORDBREAK,即

font->DrawTextA(spriteobj, text.c_str(), text.length(), &rect, DT_WORDBREAK, color);

显示效果如图4所示:

图4
图4

原文地址:https://www.cnblogs.com/leihui/p/8953385.html