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;
}
程序运行结果:
源代码及工程文件下载地址:
百度网盘相关文章推荐
- DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之6: Chap8: Drawing in Direct3D ---- Part II
- DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之5: Chap7: Drawing in Direct3D ---- Part I
- Direct3D学习手记八:模板技术【镜面效果】
- Direct3D学习手记四:光照、材质与顶点法向量
- Direct3D学习手记七:Alpha融合技术
- Direct3D学习手记五:纹理映射
- Direct3D学习手记六:深度
- Direct3D学习手记十一:网格二【从.x文件中加载网格】
- DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之2: Chap4: Direct3D Initialization
- Direct3D学习手记一:实现Direct3D程序框架
- Direct3D学习手记二:绘制简单3D物体
- Direct3D学习手记十:网格一【手动创建网格】
- Direct3D学习手记三:绘制彩色3D物体
- Atlas学习手记(7):使用DragOverlayExtender实现拖放功能
- python学习手记 pt2
- .Net学习笔记----2015-07-02(选择文件对话框、保存对话框、字体和颜色对话框)
- ROS进阶学习手记 10 - 用iRobot Create 2搭建自己的TurtleBot(1)- Introduction
- Scipy的学习手记
- 结对编程 学习手记ver1.2
- Direct3D 9学习笔记(9)文本绘制