Direct3D字体

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的使用

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

使用DrawText绘制文本
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;

D3DXCreateText函数

该函数用于创建文本的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);

你可能感兴趣的:(前端)