DirectX9:基础篇 第七章 字体

一.简介

在Direct3D中,有三种输出文字的方法:

  • (1) ID3DXFont 接口渲染文字
  • (2) CD3DFont 类渲染文字
  • (3) D3DXCreateText() 函数渲染文字

 

二.ID3DXFont

1.创建 ID3DXFont 接口

HRESULT D3DXCreateFontIndirect(

  LPDIRECT3DDEVICE9 pDevice,

  CONST LOGFONT* pLogFont,

  LPD3DXFONT* ppFont

);

 

1
2
3
4
5
6
7
8
9
10
11
12
13
LOGFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT));
lf.lfHeight = 25;
lf.lfWidth = 12;
lf.lfWeight = 500;
lf.lfItalic = false;
lf.lfUnderline = false;
lf.lfStrikeOut = false;
lf.lfCharSet = DEFAULT_CHARSET;
 
strcpy(lf.lfFaceName, "Times New Roman");
ID3DXFont* font = 0;
D3DXCreateFontIndirect(Device, &lf, &font);

 

2.绘制文本

INT ID3DXFont::DrawText(

  LPCSTR pString,    // 要绘制的文字

  INT Count,       // 字符数量

  LPRECT pRect,      // 文本绘制范围

  DWORD Format,    // 文字格式化

  D3DCOLOR Color     // 文字颜色

);

 

1
2
3
4
5
6
7
Font->DrawText(
    "Hello World",
    -1,
    &rect,
    DT_TOP | DT_LEFT,
    0xff000000
);

 

3.计算每秒的渲染帧数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DWORD FrameCnt;
float TimeElapsed;
float FPS;
 
void CalcFPS(float timeDelta)
{
    FrameCnt++;
    TimeElapsed += timeDelta;
    if (TimeElapsed >= 1.0f)
    {
        FPS = (float)FrameCnt / TimeElapsed;
        TimeElapsed = 0.0f;
        FrameCnt = 0;
    }
}

 

三.CD3DFont

1.创建 CD3DFont 类

CD3DFont(

     const TCHAR* strFontName,  // 以null结束的字符串,

      DWORD dwHeight,      // 字体的高度

      DWORD dwFlags = 0L     // 可选参数: D3DFONT_BOLD, D3DFONT_ITALIC, D3DFONT_ZENABLE

);

1
2
3
Font  = new CD3DFont("Times New Roman", 16, 0);
Font->InitDeviceObjects(Device);
Font->RestoreDeviceObjects();

 

2.绘制文本

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

1
Font->DrawText(20, 20, 0xff000000, "Hello World");

 

3.清除文本

1
2
3
Font->InvalidateDeviceObjects();
Font->DeleteDeviceObjects();
delete Font;

 

四.D3DXCreateText()

HRESULT D3DXCreateText(

  LPDIRECT3DDEVICE9 pDevice,

  HDC hDC,

  LPCTSTR pText,

  FLOAT Deviation,

  FLOAT Extrusion,

  LPD3DXMESH* ppMesh,

  LPD3DXBUFFER* ppAdjacency,

  LPGLYPHMETRICSFLOAT pGlyphMetrics

);

  • pDevice

    设备

  • hDC

    设备环境句柄

  • pText

    指向以 null 结束的字符串指针

  • Deviation

    字形轮廓,值越接近0越光滑

  • Extrusion

    文字在 z 轴方向的深度

  • ppMesh

    

  • ppAdjacency

    

  • pGlyphMetrics

    一个指向 LPGLYPHMETRICSFLOAT 结构数组的指针

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HDC hdc = CreateCompatibleDC(0);
 
LOGFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT));
 
lf.lfHeight = 25;
lf.lfWidth = 12;
lf.lfWeight = 500;
lf.lfItalic = false;
lf.lfUnderline = false;
lf.lfStrikeOut = false;
lf.lfCharSet = DEFAULT_CHARSET;
<br>// font style
strcpy(lf.lfFaceName, "Times New Roman");
<br>// Create a font and select that
HFONT hFont;
HFONT hFontOld;
hFont = CreateFontIndirect(&lf);
hFontOld = (HFONT)SelectObject(hdc, hFont);<br><br>// Create the 3D mesh of text<br>ID3DXMesh* Text = 0;<br>D3DXCreateText(_device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);<br><br>// Reselect the old font, and free resources<br>SelectObject(hdc, hFontOld);<br>DeleteObject(hFont);<br>DeleteDC(hdc);<br><br>Text->DrawSubset(0);

 

posted @   言午丶  阅读(724)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示