首页 > 代码库 > DirectX中的字体应用

DirectX中的字体应用

1 DX中的创建字体的函数
 HRESULT  D3DXCreateFont(
  __in   LPDIRECT3DDEVICE9 pDevice,
  __in   INT Height,
  __in   UINT Width,
  __in   UINT Weight,
  __in   UINT MipLevels,
  __in   BOOL Italic,
  __in   DWORD CharSet,
  __in   DWORD OutputPrecision,
  __in   DWORD Quality,
  __in   DWORD PitchAndFamily,
  __in   LPCTSTR pFacename,
  __out  LPD3DXFONT *ppFont
);
 HRESULT  D3DXCreateFontIndirect(
  __in   LPDIRECT3DDEVICE9 pDevice,
  __in   const D3DXFONT_DESC *pDesc,
  __out  LPD3DXFONT *ppFont
);
typedef struct D3DXFONT_DESC {
  INT   Height;
  UINT  Width;
  UINT  Weight;
  UINT  MipLevels;
  BOOL  Italic;
  BYTE  CharSet;
  BYTE  OutputPrecision;
  BYTE  Quality;
  BYTE  PitchAndFamily;
  TCHAR FaceName;
} D3DXFONT_DESC, *LPD3DXFONT_DESC;

可以看出函数D3DXCreateFont跟函数D3DXCreateFontIndirect 如出一辙,只不过是在D3DXCreateFontIndirect中用结构体D3DXFONT_DESC代替了诸多D3DXCreateFont中纷乱的参数。


下面详细介绍一下各个参数的含义:
Height:字体的高度
Width:字体的宽度
Weight:字体的权重,范围是0到1000,也就是字体的粗细,0最细,1000最粗
MipLevels:字体的过滤属性,如果值是0或者D3DX_DEFAULT,那么完整的mipmap链被创建,如果是1则纹理空间被等同的映射到屏幕空间。
Italic:布尔类型的变量,TRUE表示斜体,FALSE表示不是斜体
CharSet:字符集,一般设置为默认值DEFAULT_CHARSET
OutputPrecision:表示输出文本的精度,就是指输出的文字跟字体要求的宽度,高度,字符方向,行距,间距,字体类型等的契合度,通常设置为OUT_DEFAULT_PRECTS,具体可见WinGDI.h中的定义类型
Quality :输出质量,一般也设置为DEFAULT_QUALITY
PitchAndFamily :间距和字体系列,一般设置为0。具体可以见WinGDI
#define DEFAULT_PITCH           0
#define FIXED_PITCH             1
#define VARIABLE_PITCH          2
#if(WINVER >= 0x0400)
#define MONO_FONT               8


#define FF_DONTCARE         (0<<4)  /* Don‘t care or don‘t know. */
#define FF_ROMAN            (1<<4)  /* Variable stroke width, serifed. */
                                    /* Times Roman, Century Schoolbook, etc. */
#define FF_SWISS            (2<<4)  /* Variable stroke width, sans-serifed. */
                                    /* Helvetica, Swiss, etc. */
#define FF_MODERN           (3<<4)  /* Constant stroke width, serifed or sans-serifed. */
                                    /* Pica, Elite, Courier, etc. */
#define FF_SCRIPT           (4<<4)  /* Cursive, etc. */
#define FF_DECORATIVE       (5<<4)  /* Old English, etc. */
这样的话我就可以在字体系列和字间隔之间随意搭配,


FaceName:字体名称,比如“宋体”,“华文彩云”等

示例:
//创建字体
HR( D3DXCreateFont(m_pDevice,30,20,0,D3DX_DEFAULT,false,DEFAULT_CHARSET,OUT_TT_ONLY_PRECIS,
		DEFAULT_QUALITY,81,TEXT("宋体"),&m_pFont) );
//绘制字体
	RECT rect;
	GetClientRect(m_hwnd,&rect);


	TCHAR buf[50] = {0};
	int nSize = _stprintf(buf,TEXT("FPS:%0.2f"),getFPS(dTime) );
	HR( m_pFont->DrawText(NULL,buf,nSize,&rect,DT_RIGHT,D3DCOLOR_XRGB(2,190,100)) );
	rect.top = 100;
	HR( m_pFont->DrawText(NULL,TEXT("不会磨灭的激情forever"),-1,&rect,DT_CENTER,D3DCOLOR_XRGB(200,90,100)) );
	rect.top = 200;
	HR( m_pFont->DrawText(NULL,TEXT("狂傲不羁的少年forever"),-1,&rect,DT_CENTER,D3DCOLOR_XRGB(255,120,10)) );

2 与之对应的GDI中的创建字体的函数

CreateFont,以及CreateFontIndirect


3 3D字体
D3DXCreateText函数,创建一个网格,绘制文字的时候就是绘制对应的网格
 HRESULT  D3DXCreateText(
  __in   LPDIRECT3DDEVICE9 pDevice,
  __in   HDC hDC,
  __in   LPCTSTR pText,
  __in   FLOAT Deviation,
  __in   FLOAT Extrusion,
  __out  LPD3DXMESH *ppMesh,
  __out  LPD3DXBUFFER *ppAdjacency,
  __out  LPGLYPHMETRICSFLOAT pGlyphMetrics
);

pText:要显示的内容
Deviation:TrueType字体轮廓的最大弦偏差,该值必须是非负弦偏差等于原始字体的一个设计单位,一般设置为0.001
Extrusion:沿Z轴负方向的字体深度
ppMesh:返回创建的字体网格
ppAdjacency:返回创建网格的邻接信息,如果不需要可以用指定该参数为NULL
pGlyphMetrics:指向LPGLYPHMETRICSFLOAT类型结构体的指针,该结构包含了字形(glyph)的度量数据(metric data),如果不需要该数值,可以将其设为NULL

可以看到函数的参数中有hdc这一选项,这个主要是为了将HFONT选入设备上下文,然后利用该字体去绘制3D文字网格。,因此我们需要先创建字体,然后将字体选入设备中。
创建字体毫无疑问就是利用上面说的CreateFont或者CreateFontIndirect函数。

示例如下:
//创建字体
	HFONT hFont;
	HFONT hFontOld;
	HDC hdc = CreateCompatibleDC(NULL);


	hFont = CreateFont(25,12,0,0,500,false,false,false,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS, 
		CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,TEXT("宋体") );
	hFontOld = (HFONT)SelectObject(hdc,hFont);
	D3DXCreateText(m_pDevice,hdc,TEXT("不经打击老天真"),0.001f,0.5f,&m_pFontMesh,NULL,NULL);


	SelectObject(hdc,hFontOld);
	DeleteObject(hFont);
	DeleteDC(hdc);
//绘制字体
	m_pFontMesh->DrawSubset(0);

最终显示效果:


程序的下载地址:下载地址