DirectX学习笔记(十):3D字体的实现及用ID3DXFont接口绘制文本

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
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值