您的位置:首页 > 其它

Direct3D学习手记九:字体

2013-12-29 10:25 351 查看

本文介绍Direct3D里的字体来绘制文本

ID3DXFont接口:

本文重点介绍使用ID3DXFont来绘制文本信息,该接口内部使用GDI绘制

创建字体:

方式一:

HRESULT D3DXCreateFont( LPDIRECT3DDEVICE9 pDevice, INT Height, UINT Width, UINT Weight, UINT MipLevels, BOOL Italic, DWORD CharSet, DWORD OutputPrecision, DWORD Quality, DWORD PitchAndFamily, LPCTSTR pFacename, LPD3DXFONT * ppFont);
pDevice为设备指针,Height为字体高度,Width为字体宽度,Weight为字体的粗细,

MipLevels置为D3DX_DEFAULT,Italic为斜体标志,

CharSet为字符集置为DEFAULT_CHARSET,pFacename为字体名称,ppFont为保存字体的指针,其他置为0即可

例如:

//方式一
D3DXCreateFont(g_pd3dDevice,60,40,800,D3DX_DEFAULT,FALSE,DEFAULT_CHARSET,0,0,0,TEXT("微软雅黑"),&g_pHelpFont);

方式二:

HRESULT D3DXCreateFontIndirect( LPDIRECT3DDEVICE9 pDevice,
CONST D3DXFONT_DESC * pDesc, LPD3DXFONT * ppFont);其中D3DXFONT_DESC的结构如下:
typedef struct D3DXFONT_DESC {
INT Height;
UINT Width;
UINT Weight;
UINT MipLevels;
BOOL Italic;
BYTE CharSet;
BYTE OutputPrecision;
BYTE Quality;
BYTE PitchAndFamily;
TCHAR FaceName[LF_FACESIZE];
} D3DXFONT_DESC, *LPD3DXFONT_DESC;其成员意义和方式一中函数D3DXCreateFont里对应的参数意义相同。
例如:

//方式二
D3DXFONT_DESC fd;
ZeroMemory(&fd,sizeof(D3DXFONT_DESC));
fd.Height=50;
fd.Width=30;
fd.Weight=500;
fd.MipLevels=D3DX_DEFAULT;
fd.Italic=TRUE;
fd.CharSet=DEFAULT_CHARSET;
fd.OutputPrecision=0;
fd.PitchAndFamily=0;
fd.Quality=0;
_tcscpy_s(fd.FaceName,TEXT("Times New Roman"));
D3DXCreateFontIndirect(g_pd3dDevice,&fd,&g_pTipFont);

绘制文本:

使用如下函数:

INT DrawText( LPD3DXSPRITE pSprite, LPCTSTR pString, INT Count,
LPRECT pRect, DWORD Format, D3DCOLOR Color);pSprite置为NULL即可,表示在当前窗口绘制文本
pString为要绘制的字符串

Count为字符串的长度

pRect指定在那个矩形内绘制文本

Format为绘制格式,有DT_LEFT,DT_RIGHT,DT_TOP,DT_BOTTOM,DT_CENTER等待

Color为文本颜色

例如:

RECT rect;
rect.left=20;
rect.top=50;

rect.right=g_nWidth;
rect.bottom=g_nHeight;

g_pHelpFont->DrawText(NULL,g_pszWindowName,_tcslen(g_pszWindowName),&rect,DT_CENTER,D3DCOLOR_XRGB(200,100,50));

绘制提示信息:

使用函数RenderHelpText函数绘制提示信息,以后可以重复利用

/****************************************************************
*函数名 : RenderHelpText
*功能 : 在屏幕上绘制帮助文本
*输入 : 无
*输出 : 无
*返回值 : 无
****************************************************************/
void RenderHelpText()
{
WCHAR buf[MAX_PATH]={0};

RECT rect;
rect.left=20;
rect.top=50;

rect.right=g_nWidth;
rect.bottom=g_nHeight;

g_pHelpFont->DrawText(NULL,g_pszWindowName,_tcslen(g_pszWindowName),&rect,DT_CENTER,D3DCOLOR_XRGB(200,100,50));

rect.top=200;
g_pTipFont->DrawText(NULL,TEXT("Press Esc to Exit !!!"),_tcslen(TEXT("Press Esc to Exit !!!")),&rect,DT_CENTER,D3DCOLOR_XRGB(200,50,50));

rect.top=300;
swprintf(buf,L"FPS : %0.3f",GetFPS());
g_pTipFont->DrawTextW(NULL,buf,wcslen(buf),&rect,DT_CENTER,D3DCOLOR_XRGB(50,80,200));

rect.left=20;
rect.top=400;

g_pTipFont->DrawText(NULL,TEXT("Don't worry,be happy ^_^!"),_tcslen(TEXT("Don't worry,be happy ^_^!")),&rect,DT_CENTER,D3DCOLOR_XRGB(200,200,0));

rect.top=500;
g_pHelpFont->DrawText(NULL,TEXT("☆亮☆晶☆晶☆"),_tcslen(TEXT("☆亮☆晶☆晶☆")),&rect,DT_CENTER,D3DCOLOR_XRGB(rand()%255,rand()%255,rand()%255));
}

FPS:

FPS指的是每秒绘制的帧数,这里给出计算函数:

/****************************************************************
*函数名 : GetFPS
*功能 : 计算每秒绘制的帧数
*输入 : 无
*输出 : 无
*返回值 : 每秒绘制的帧数
****************************************************************/
float GetFPS()
{
static float fps=0.0f;
static DWORD dwFrames=0;//绘制的帧数
static DWORD dwLastTime=0;//上次绘制时间
static DWORD dwCurrentTime=0;//当前绘制时间
static DWORD dwPassTime=0;//上次更新FPS的值到现在的时间

dwFrames++;
dwLastTime=dwCurrentTime;
dwCurrentTime=timeGetTime();
dwPassTime+=(dwCurrentTime-dwLastTime);

if(dwPassTime>=1000)//每过一秒更新一次,否则不更新
{
fps=1000.0f*(float)(dwFrames)/(float)(dwPassTime);//帧数除以经过时间
dwPassTime=0;
dwFrames=0;
}
return fps;
}

程序运行结果:





源代码及工程文件下载地址:

百度网盘
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: