基于DirectX的简单UI界面制作

这篇博客介绍了如何利用DirectX基础制作简单的UI界面,包括主界面、开始游戏、加载游戏和选项等。通过4个核心文件——D3DComMacro.h、GUIClass.h、GUIClass.cpp和main.cpp,阐述了实现过程,适合有一定DirectX基础的学习者参考。
摘要由CSDN通过智能技术生成

代码里注释写的比较清楚,有点DirectX基础的就能简单看懂,

谨以此文记录那些年写过的代码,和分享给那些需要的朋友o(∩_∩)o


//D3DComMacro.h

/*--------------------------------------------------------------
【头文件】:D3DComMacro.h    Create by Beyond Ray,2014年2月
(描述):公共辅助宏的定义
----------------------------------------------------------------*/
#pragma once

#ifndef HR
#define HR(hr) {if(FAILED(hr)) return E_FAIL ;}                //定义HR宏,便于错误检测
#endif

#ifndef SAFE_RELEASE
#define SAFE_RELEASE(p)  {if(p) { (p)->Release(); p = NULL ;}}  //定义一个安全释放宏,便于COM接口的释放
#endif

#ifndef SAFE_DELETE
#define SAFE_DELETE(p)   {if(p) {delete(p); p = NULL ;}}		//定义一个安全删除宏,便于new分配内存的删除      
#endif

#ifndef SAFE_DELETE_ARRAY
#define SAFE_DELETE_ARRAY(p) {if(p) {delete [] (p); p = NULL ;}}   //定义一个安全删除宏,便于new[]分配内存的删除
#endif

#ifndef IF
#define IF(p)	{if(p != D3D_OK) return false;}			   //定义一个IF宏,用于返回BOOL型的检测
#endif


//GUIClass.h

/*--------------------------------------------------------------
【头文件】:GUIClass.h       Created by Beyond Ray,2014年2月
(描述):一个封装了控件对象的类和控件处理函数
----------------------------------------------------------------*/

#pragma  once

#include"D3DComMacro.h"
#include<d3d9.h>
#include<d3dx9.h>

//定义控件类型
#define UGP_GUI_STATIC_TEXT	1
#define UGP_GUI_BUTTON		2

//定义鼠标按键及指针的状态
#define GUI_LBUTTON_DOWN	1
#define GUI_LBUTTON_UP		2
#define GUI_MOUSE_OVER		3

//定义菜单页面切换的宏
#define GUI_BKGROUND_MAIN	1
#define GUI_BKGROUND_START	2
#define GUI_BKGROUND_LOAD	3
#define GUI_BKGROUND_OPTION	4

//具体的控件类型ID
#define GUI_STATIC_TEXT		0
#define GUI_BUTTON_START	1
#define GUI_BUTTON_LOAD		2
#define GUI_BUTTON_OPTION	3
#define GUI_BUTTON_QUIT		4
#define GUI_BUTTON_BACK     5

//定义控件类型ID最大上限编号
#define GUI_TEXT_MAX		0
#define GUI_BUTTON_MAX		5

//灵活顶点格式的结构
typedef struct  
{
	float x, y, z, rhw;			//顶点坐标
	
	float u, v;					//纹理贴图
	//DWORD color;
	
} GUIVERTEX, * LPGUIVERTEX;

#define D3DFVF_GUI (D3DFVF_XYZRHW | D3DFVF_TEX1 )

//控件属性结构体
struct GUICONTROL
{
	int type;					//控件的类型(文本、按钮)
	int controlID;				//控件的具体类型ID
	WORD index;					//文本:对字体对象的索引,按钮:对顶点缓存的索引			
	WORD x;						//控件相对于窗口客户区左上角的X位置
	WORD y;						//控件相对于窗口客户区左上角的Y位置		
	WORD width;					//控件的宽度
	WORD height;				//控件的高度
	TCHAR * text;				//文本的内容
	unsigned long color;		//文本的颜色
	LPDIRECT3DTEXTURE9 textureUP, textureDown, textureOver;  //(只相对于按钮)表示鼠标按下,释放,经过时的纹理贴图
};

//【定义一个GUI对象类】
class GUIClass
{
private:
	LPDIRECT3DDEVICE9		m_pd3dDevice9;		//Direct3D设备对象(COM接口对象)
	LPDIRECT3DTEXTURE9		m_pBackGround;		//控件对象的背景贴图(COM接口对象)
	LPDIRECT3DVERTEXBUFFER9 m_pBkBuffer;		//背景图缓存对象(COM接口对象)

	LPD3DXFONT			  * m_pFont;			//指向字体对象的指针(COM接口对象数组)
	LPDIRECT3DVERTEXBUFFER9 * m_pCtrlBuffer;	//控件按钮缓存对象的指针(COM接口对象数组)
	GUICONTROL			  * m_pControl;			//控件的数组对象

	int		m_iFontNums;		//字体种类的数目
	int     m_iTextNums;		//文本对象的数目
	int		m_iButtonNums;		//按钮对象的数目
	int		m_iControlNums;		//控件对象的数目

	WORD	m_wBackgroundWidth;		//贴图背景的宽度
	WORD	m_wBackgroundHeight;	//贴图背景的高度

	BOOL	m_bIsBKBufferUsed;	//用一个标识来判断是否使用了背景(以缓冲区的创建为标志)

public:
	GUIClass(LPDIRECT3DDEVICE9 pd3dDevice9, WORD Width, WORD Height);	//构造函数		
	~GUIClass(){ CleanUp(); }											//析构函数

public:
	LPDIRECT3DDEVICE9 GetDevice(){ return m_pd3dDevice9; }	//返回设备对象

	int		GetFontNums(){ return m_iFontNums; }			//返回字体种类的数目	
	int		GetTextNums(){ return m_iTextNums; }			//返回文本对象的数目
	int		GetButtonNums(){ return m_iButtonNums; }		//返回按钮对象的数目
	int		GetControlNums(){ return m_iControlNums; }		//返回控件对象的数目

	WORD	GetBackgroundWidth(){ return m_wBackgroundWidth; }		//返回贴图背景的宽度
	WORD	GetBackgroundHeight(){ return m_wBackgroundHeight; }	//返回贴图背景的高度

	VOID	SetBackgroundWidth(WORD Width){ m_wBackgroundWidth = Width; }		//设置贴图背景的宽度
	VOID	SetBackgroundHeight(WORD Height){ m_wBackgroundHeight = Height; }	//设置贴图背景的高度

	LPDIRECT3DTEXTURE9 GetBkTexture(){ return m_pBackGround; }		//返回背景纹理贴图
	LPDIRECT3DVERTEXBUFFER9 GetBkBuffer(){ return m_pBkBuffer; }	//返回背景顶点缓存

	BOOL	IsBKBufferUsed(){ return m_bIsBKBufferUsed; }			//判断是否使用了背景(以缓冲区的创建为标志)

	//用索引分别得到字体,按钮顶点缓存,控件的对象
	LPD3DXFONT	GetFont(WORD Index)
	{
		if (Index >= m_iFontNums) return NULL;
		return m_pFont[Index];
	}

	LPDIRECT3DVERTEXBUFFER9 GetCtrlBuffer(WORD Index)
	{
		if (Index >= m_iButtonNums) return NULL;
		return m_pCtrlBuffer[Index];
	}

	GUICONTROL*	GetControl(WORD Index)
	{ 
		if (Index >= m_iControlNums) return NULL;
		return &m_pControl[Index];
	}

	BOOL AddBackground(TCHAR * pBackgroundName);												//添加背景
	BOOL CreateTextFont(TCHAR * FontName, DWORD SIZE, WORD *Index);								//增加字体
	BOOL AddStaticText(TCHAR * TextContent, UINT ControlID, DWORD Color, WORD x, WORD y, WORD Index);//增加文本
	BOOL AddButton(UINT ControlID, WORD x, WORD y,												//增加按钮
		TCHAR* TextureDown, TCHAR* TextureUp, TCHAR* TextureOver);
	VOID CleanUp();																				//资源的清理	
};

BOOL ProcessGUI(GUIClass * GUI, BOOL LMBDown, WORD MouseX, WORD MouseY,
	void(CALLBACK *GUIProc)(int Id, int State));	//回调函数作形参





//GUIClass.cpp

/*--------------------------------------------------------------
【Cpp文件】:GUIClass.cpp       Created by Beyond Ray,2014年2月
(描述):一个封装了控件对象的类和控件处理函数的实现
----------------------------------------------------------------*/

#include"GUIClass.h"

//-------------------------------------------【GUIClass()函数】--------------------------------------------------
// Desc:构造函数(初始化)
//---------------------------------------------------------------------------------------------------------------
GUIClass::GUIClass(LPDIRECT3DDEVICE9 pd3dDevice9, WORD Width, WORD Height)
{
	m_pd3dDevice9 = pd3dDevice9;
	m_pBackGround = NULL;
	m_pBkBuffer = NULL;

	m_pControl = NULL;
	m_pCtrlBuffer = NULL;
	m_pFont = NULL;

	m_iFontNums = 0;
	m_iTextNums = 0;
	m_iControlNums = 0;
	m_iButtonNums = 0;

	m_wBackgroundWidth = Width;
	m_wBackgroundHeight = Height;

	m_bIsBKBufferUsed = FALSE;
}

//-------------------------------------------【AddBackground()函数】---------------------------------------------
// Desc:添加GUIClass对象的唯一背景图片
//---------------------------------------------------------------------------------------------------------------
BOOL GUIClass::AddBackground(TCHAR *  pBackgroundName)
{
	if (!pBackgroundName) return FALSE;
	IF(D3DXCreateTextureFromFile(m_pd3dDevice9, pBackgroundName, &m_pBackGround));

	IF(m_pd3dDevice9->CreateVertexBuffer(4 * sizeof(GUIVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_GUI,
		 D3DPOOL_DEFAULT, &m_pBkBuffer, NULL));

	float w = (float)m_wBackgroundWidth;
	float h = (float)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值