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);
最终显示效果: