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); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)