ID3DXFont接口介绍:
D3DX库提供了ID3DXFont 接口,该接口用于在Direct3D应用程序中绘制文本。这个接口的使用,有优点,也有缺点。缺点就是在接口的内部使用了GDI图形设备接口,导致了该接口在性能上会有稍微的损失。优点就是由于在接口的内部使用了GDI图形设备接口,导致了它能够处理一些复杂的字体和格式。
1.如何使用ID3DXFont接口绘制文本信息
第一步:创建一个ID3DXFont对象:
//字体接口
ID3DXFont* Font = 0;
第二步:填充D3DXFONT_DESC结构
在创建完毕后,我们需要对索要使用的字体进行描述,那么这个时候就需要用到D3DXFONT_DESC结构。该结构的参数如下
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 df;
ZeroMemory(&df, sizeof(D3DXFONT_DESC));
df.Height = 25;
df.Width = 12;
df.MipLevels = D3DX_DEFAULT;
df.Italic = false;
df.CharSet = DEFAULT_CHARSET;
df.OutputPrecision = 0;
df.Quality = 0;
df.PitchAndFamily = 0;
strcpy_s(df.FaceName, "TIME NEW ROMAN");
第三部:填充完绘制:
如果我们获取到了ID3DXFont接口的指针,就只需要调用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//文字的颜色
);
我们就这样指定:
Font->DrawTextA(NULL, "Hello World", -1,&rect, DT_TOP | DT_LEFT, 0xff000000);
以上就完成了。
完整代码:
#include <windows.h>
#include<d3d9.h>
#include<string>
#include<d3dx9.h>
using namespace std;
#define SCREEN_WIDTH 800 //窗口宽度
#define SCREEN_HEIGHT 600 //窗口高度
#define FVF_VERTEX (D3DFVF_XYZ | D3DFVF_TEX1)
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //自定义一个SAFE_RELEASE()宏,便于资源的释放
IDirect3DDevice9* _device; //Direct3D设备
//字体接口
ID3DXFont* Font = 0;
//函数声明
//初始化Direct3D
//消息过程,处理消息
bool InitD3D(HINSTANCE hInstance, int width, int height, bool windowed, D3DDEVTYPE deviceType, IDirect3DDevice9 ** device);
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
//以下为窗口过程
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY: //销毁
::PostQuitMessage(0);//终止请求
break;
case WM_KEYDOWN:
if (wParam == VK_ESCAPE)
::DestroyWindow(hwnd);
break;
}
//调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。
//该函数确保每一个消息得到处理
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
//初始化D3D
bool InitD3D(HINSTANCE hInstance, int width, int height, bool windowed, D3DDEVTYPE deviceType, IDirect3DDevice9 ** device)
{
//定义一个完整的窗口类
WNDCLASS wc;
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName = "LSZDX";
wc.lpszMenuName = 0;
//注册窗口类
if (!(RegisterCl