首页 > 代码库 > DirectX中的字体应用
DirectX中的字体应用
1 DX中的创建字体的函数
可以看出函数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:字体名称,比如“宋体”,“华文彩云”等
示例:
2 与之对应的GDI中的创建字体的函数
D3DXCreateText函数,创建一个网格,绘制文字的时候就是绘制对应的网格
pText:要显示的内容
Deviation:TrueType字体轮廓的最大弦偏差,该值必须是非负弦偏差等于原始字体的一个设计单位,一般设置为0.001
Extrusion:沿Z轴负方向的字体深度
ppMesh:返回创建的字体网格
ppAdjacency:返回创建网格的邻接信息,如果不需要可以用指定该参数为NULL
pGlyphMetrics:指向LPGLYPHMETRICSFLOAT类型结构体的指针,该结构包含了字形(glyph)的度量数据(metric data),如果不需要该数值,可以将其设为NULL
可以看到函数的参数中有hdc这一选项,这个主要是为了将HFONT选入设备上下文,然后利用该字体去绘制3D文字网格。,因此我们需要先创建字体,然后将字体选入设备中。
创建字体毫无疑问就是利用上面说的CreateFont或者CreateFontIndirect函数。
示例如下:
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
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);
最终显示效果:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。