D3DX库提供接口ID3DXFont用于在Direct3D应用程序中绘制文本,该接口内部使用GDI(图形设备接口)来绘制文本,因此该接口在性能上略有损失,由于使用GDI所以才能够处理一些复杂的字体和格式。可以用D3DXCreateFontIndirect函数来创建一个ID3DXFont的接口对象。
HRESULT D3DXCreateFontIndirect(
LPDIRECT3DDEVICE9 pDevice,
CONST D3DXFONT_DESC* pDesc,
LPD3DXFONT* ppFont
);
一旦获取了ID3DXFont接口的指针,只需要调用方法ID3DXFont::DrawText即可轻而易举地完成文本的绘制。
INT ID3DXFont::DrawText(
LPD3DXSPRITE pSprite,
LPCSTR pString,
INT Count,
LPRECT pRect,
DWORD Format,
D3DCOLOR Color
);
Font->DrawText(
NULL,
"Hello,World",
-1,
&rect,
DT_TOP | DT_LEFT,
0xff000000);
pSprite:指定字符串所属的ID3DXSprite对象接口,可设为默认值0或NULL,表示在当前窗口中绘制字符串
pString:指向将要绘制的字符串的指针
Count:字符串中的字符个数,若该值为-1,则认为参数pString指向一个以NULL结尾的字符串,DrawText方法将自动对字符个数进行统计
pRect:指定字符串绘制的矩形区域的位置
Format:指定了字符串在pRect指定的矩形区域中的格式化方法,该参数是一系列可选博阿基的某一个或某种组合
Color:文本颜色
CD3DFont类绘制文本时使用的是Direct3D而非GDI,所以其绘制的速度比ID3DXFont要快很多,但该类也有缺陷,它不支持ID3DXFont所支持的那些复杂的字体和格式,如果很在意速度而且简单字体能满足要求,CD3DFont类是一个很好的选择。
CD3DFont(const TCHAR* strFontName, DWORD deHeight, DWORD dwFlags = 0L)
//实例化一个CD3DFont类的对象后,必须调用如下方法来对字体进行初始化
Font=new CD3DFont("Times New Roman",16,0);
Font->InitDeviceObject(Device);
Font->RestoreDeviceObjects();
StrFontName:一个以NULL结尾的字符串,它指定了字体的名称
dwHeigh:字体的高度
dwFlags:创建标记,该参数可设为0或以下标记的组合,D3DFONT_BOLD、D3DFONT_ITALIC、D3DFONT_ZENABLE
HRESULT CD3DFont::DrawText(
FLOAT x,
FLOAT y,
DWORD dwColor,
const TCHAR* strText,
DWORD dwFlags = 0)
Font->DrawText(20,20,0xff000000,"Hello World");
x:屏幕坐标系中文本绘制的起点的x坐标
y:屏幕坐标系中文本绘制的起点的y坐标
dwColor:文本的颜色
strText:指向所要绘制文本的指针
在删除一个CD3DFont类的对象之前,我们必须首先调用一些清理函数
Font->InvalidateDeviceObjects();
Font->DeleteDeviceObjects();
delete Font;
该函数用于创建文本的3D网格,如果调用成功则返回D3D_OK
HRESULT D3DXCreateText(
LPDIRECT3DDEVICE9 pDevice,
HDC hDC,
LPCWSTR pText,
FLOAT Deviation,
FLOAT Extrusion,
LPD3DXMESH* ppMesh,
LPD3DXBUFFER* ppAdjacency,
LPGLYPHMETRICSFLOAT pGlyphMetrics
);
pDevice:指向与网格相关的设备
hDC:一个设备环境句柄,它包含了我们将用来创建网格的字体的相关信息
pText:指向确定所要用于生成文本的字符串的指针
Deviation:TrueType字体轮廓的最大弦偏差,该值必须为非负,弦偏差等于原始字体的一个设计单位
Extrusion:沿z轴负方向度量的字体深度
ppMesh:返回所创建的网格
ppAdjacency:返回所创建的网格的邻接信息,如果不需要该值,请指定为NULL
pGlyghMetrics:指向LPGLYPHMETRICSFLOAT类型结构数组的指针,该结构包含了字形和度量数据,如果不关心字形的度量数据,可将该值设为0
HDC hdc = CreateCompatibleDC(0);
HFONT hFont;
HFONT hFontOld;
LOGFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT));
lf.lfHeight = 25;
lf.lfWidth = 12;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = 500;
lf.lfItalic = false;
lf.lfUnderline = false;
lf.lfStrikeOut = false;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfOutPrecision = 0;
lf.lfClipPrecision = 0;
lf.lfQuality = 0;
lf.lfPitchAndFamily = 0;
wcscpy(lf.lfFaceName, L"Time New Roman");
hFont = CreateFontIndirect(&lf);
hFontOld = (HFONT)SelectObject(hdc, hFont);
D3DXCreateText(Device, hdc, L"Direct3D", 0.001f, 0.4f, &Text, 0, 0);
SelectObject(hdc, hFontOld);
DeleteObject(hFont);
DeleteDC(hdc);
TEXT->DrawSubset(0);