D3D学习笔记:字体

ID3DXFont

ID3DXFont在绘制文字的时候使用的是GDIAPIDXUT提供了一个东西叫做CDXUTTextHelper,它封装了需要的ID3DXFont以及Sprite,并提高了工作效率。那就是它在内存中开辟了一块纹理,将绘制过的文字绘制在这上面,以后再次遇到这个字的时候就直接当做普通纹理处理了。这样做的代价就是内存的开销变大。

1.       创建一个ID3DXFont接口

HRESULT  D3DXCreateFontIndirect(

  __in   LPDIRECT3DDEVICE9 pDevice,

  __in   const D3DXFONT_DESC *pDesc,

  __out  LPD3DXFONT *ppFont

);

字体结构:

typedef struct D3DXFONT_DESC {

         INT   Height;//Height, in logical units,指的是字体的高度,

         UINT  Width;//Width, in logical units

         UINT  Weight;//Weight of the font in the range from 0 through 1000.

         UINT  MipLevels;//文本的Miplevels

         BOOL  Italic;//是否斜体

         BYTE  CharSet;//字符集

         BYTE  OutputPrecision;// 指定Windows与期望字体大小的匹配方法

         BYTE  Quality;//输出质量

         BYTE  PitchAndFamily;//斜度和family索引

         TCHAR FaceName;//字体类型名称

} D3DXFONT_DESC, *LPD3DXFONT_DESC;

例:填充字体结构

         D3DXFONT_DESC font;

         memset(&font,0,sizeof(font));

         font.Height =22;

         font.Width = 12;

         font.Weight = 500;

         font.Italic = FALSE;

         font.MipLevels = 0;

         font.OutputPrecision = OUT_DEFAULT_PRECIS;

         font.PitchAndFamily = DEFAULT_PITCH;

         font.Quality = DEFAULT_QUALITY;

         font.CharSet = DEFAULT_CHARSET;

         strcpy(font.FaceName,"Times New Roman");

         ID3DXFont * pFont=0;

         D3DXCreateFontIndirect(Device,&font,&pFont);

 

绘制文本:

使用ID3DXFONT::DrawText()函数

INT DrawText(

         [in]  LPD3DXSPRITE pSprite,//用来绘制文字的sprite对象

         [in]  LPCTSTR pString,//指向字符串的指针

         [in]  INT Count,//字数.假如字符是以null结束的字符串则可将其指定为-1

         [in]  LPRECT pRect,//指向一个RECT结构,它定义一个文字被绘制在屏幕上的范围。

         [in]  DWORD Format,//可选参数,指定文字怎样被格式化,具体可以查sdk文档

         [in]  D3DCOLOR Color//文字的颜色

         );

         RECT rect;

         rect.bottom=200;

         rect.right = 200;

         rect.left =0;

         rect.top=0;

         pFont->DrawText(NULL,TEXT("xfate"),-1,&rect,DT_LEFT,0xffffffff);

计算每秒的渲染帧数:

void CalsFPS()

{

         //每一帧增加FrameCnt并且把从上一帧到现在流逝的时间写进TimeElapsed

         FrameCnt++;

         timeElapsed +=timeDelta;//imeDelta 是两帧之间的时间

         if(timeElapsed >=1.0f)

         {

                   FPS =(float)FrameCnt/timeElapsed;//在一秒种结束以后,用下面的公式来计算FPS

                   timeElapsed =0.0f;//重新设置FrameCntTimeElapsed为计算下一秒的FPS做准备

                   FrameCnt =0;

         }

}

注意:在的新的DX SDK中,已经没有CD3DFront类了。

使用CD3DFront

使用 CD3DFont 类,你需要添加下列文件到你的程序中:d3dfont.h, d3dfont.cpp, d3dutil.h,

d3dutil.cpp, dxutil.h dxutil.cpp。这些文件可以在刚才所说目录下的 Include Src 目录下。

CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);

strFontName null结束的字符串,它指定字体类型。

dwHeight 字体的高度。

dwFlags 可选参数;你能设置该参数为 0 或者用下面参数;D3DFONT_B

D3DFONT_ITALIC, D3DFONT_ZENABLE

实例化一个CD3DFont对象以后,我们必须调用下面的方法来初始化字体:

Font = new CD3DFont("Times New Roman", 16, 0); // instantiate

Font->InitDeviceObjects( Device );

Font->RestoreDeviceObjects();

绘制文本

HRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor,

  const TCHAR* strText, DWORD dwFlags=0L);

x 文字在屏幕上开始绘制的 x坐标。

y —文字在屏幕上开始绘制的 y坐标。 

dwColor 文字的颜色。

strText 要绘制的文字。

dwFlags 可选参数;你能设置该参数为 0 或者用下面参数;D3DFONT_CENTERED,

D3DFONT_TWOSIDED, D3DFONT_FILTERED

清除

在删除一个CD3DFont对象之前,我们必须首先调用一些清除程序,就象下面列举的代码片段: 

Font->InvalidateDeviceObjects();

Font->DeleteDeviceObjects();

delete Font;

 

D3DXCreateText :创建3D文字网格

HRESULT  D3DXCreateText(

         __in   LPDIRECT3DDEVICE9 pDevice,//mesh关联的device

         __in   HDC hDC,//我们将要用来产生mesh的包含描述字体的设备环境句柄。

         __in   LPCTSTR pText,//指向以null结束的字符串的指针

         __in   FLOAT Deviation,//字型轮廓段数间距。该值必须大于等于0。当它为0时,段数等于字体原始设计单位(该值越接近0,那么字体就越光滑)。

         __in   FLOAT Extrusion,//文字在z轴方向的深度。

         __out  LPD3DXMESH *ppMesh,//返回创建的mesh

         __out  LPD3DXBUFFER *ppAdjacency,//返回创建mesh的相关信息。假如你不需要它可以将其指定为null

         __out  LPGLYPHMETRICSFLOAT pGlyphMetrics//一个指LPGLYPHMETRICSFLOAT 结构数组的指针,它包含了字型米数据。假如你不关心此数据,你可以把它设置为0

                                                        );

例子:

//

         // Get a handle to a device context.

         //

         HDC hdc = CreateCompatibleDC( 0 );

    HFONT hFont;

    HFONT hFontOld;

 

         //

         // Describe the font we want.

         //

 

    LOGFONT lf;

         ZeroMemory(&lf, sizeof(LOGFONT));

 

         lf.lfHeight         = 25;    // in logical units

         lf.lfWidth          = 12;    // in logical units

         lf.lfEscapement     = 0;       

         lf.lfOrientation    = 0;    

         lf.lfWeight         = 500;   // boldness, range 0(light) - 1000(bold)

         lf.lfItalic         = false;  

         lf.lfUnderline      = false;   

         lf.lfStrikeOut      = false;   

         lf.lfCharSet        = DEFAULT_CHARSET;

         lf.lfOutPrecision   = 0;             

         lf.lfClipPrecision  = 0;         

         lf.lfQuality        = 0;          

         lf.lfPitchAndFamily = 0;   

         strcpy(lf.lfFaceName, "Times New Roman"); // font style

 

         //

         // Create the font and select it with the device context.

         //

    hFont = CreateFontIndirect(&lf);

    hFontOld = (HFONT)SelectObject(hdc, hFont);

 

         //

         // Create the text mesh based on the selected font in the HDC.

         //

    D3DXCreateText(Device, hdc, "Xfatenet",

        0.001f, 0.4f, &Text, 0, 0);

 

         //

         // Restore the old font and free the acquired HDC.

         //

    SelectObject(hdc, hFontOld);

    DeleteObject( hFont );

    DeleteDC( hdc );

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值