include.docx
《include.docx》由会员分享,可在线阅读,更多相关《include.docx(13页珍藏版)》请在冰豆网上搜索。
include
#include
#include
#include"D3DGUIClass.h"
//-----------------------------------------------------------------------------
//Desc:
构造函数
//-----------------------------------------------------------------------------
D3DGUIClass:
:
D3DGUIClass(LPDIRECT3DDEVICE9device,intw,inth)
{
m_pFonts=NULL;
m_pControls=NULL;
m_pVertexBuffer=NULL;
m_nTotalFontNum=m_nTotalControlNum=m_nTotalBufferNum=0;
m_nWindowWidth=m_nWindowHeight=0;
m_bIsBackgroundUsed=false;
m_pd3dDevice=device;
m_nWindowWidth=w;m_nWindowHeight=h;
memset(&m_Background,0,sizeof(GUICONTROL));
}
//-----------------------------------------------------------------------------
//Name:
D3DGUIClass:
:
CreateTextFont()
//Desc:
字体创建函数
//-----------------------------------------------------------------------------
boolD3DGUIClass:
:
CreateTextFont(wchar_t*fontName,intsize,int*fontID)
{
if(!
m_pd3dDevice)returnfalse;
if(!
m_pFonts)
{
m_pFonts=newLPD3DXFONT[1];
if(!
m_pFonts)returnfalse;
}
else
{
LPD3DXFONT*temp;
temp=newLPD3DXFONT[m_nTotalFontNum+1];
if(!
temp)returnfalse;
memcpy(temp,m_pFonts,
sizeof(LPD3DXFONT)*m_nTotalFontNum);
delete[]m_pFonts;
m_pFonts=temp;
}
//调用D3DXCreateTextFont函数创建字体
D3DXCreateFont(m_pd3dDevice,size,0,0,1000,0,
DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,
0,fontName,
&m_pFonts[m_nTotalFontNum]);
if(!
m_pFonts[m_nTotalFontNum])returnfalse;
//存下字体ID和ID计数。
if(fontID)*fontID=m_nTotalFontNum;
m_nTotalFontNum++;
returntrue;
}
//-----------------------------------------------------------------------------
//Name:
D3DGUIClass:
:
AddBackground()
//Desc:
创建保存背景图的缓存函数
//-----------------------------------------------------------------------------
boolD3DGUIClass:
:
AddBackground(wchar_t*fileName)
{
if(!
fileName)returnfalse;
m_Background.m_type=UGP_GUI_Background;
//从文件载入纹理图片
if(D3DXCreateTextureFromFile(m_pd3dDevice,fileName,&m_Background.m_Background)!
=D3D_OK)
returnfalse;
//获取窗口宽度和高度,以便稍后的背景铺满窗口
floatw=(float)m_nWindowWidth;
floath=(float)m_nWindowHeight;
GUIVERTEXobj[]=
{
{w,0,0.0f,1,D3DCOLOR_XRGB(255,255,255),1.0f,0.0f},
{w,h,0.0f,1,D3DCOLOR_XRGB(255,255,255),1.0f,1.0f},
{0,0,0.0f,1,D3DCOLOR_XRGB(255,255,255),0.0f,0.0f},
{0,h,0.0f,1,D3DCOLOR_XRGB(255,255,255),0.0f,1.0f},
};
//创建顶点缓存
if(FAILED(m_pd3dDevice->CreateVertexBuffer(sizeof(obj),0,D3DFVF_GUI,
D3DPOOL_DEFAULT,&m_BackgroundBuffer,NULL)))returnfalse;
//填充顶点缓存
void*ptr;
if(FAILED(m_BackgroundBuffer->Lock(0,sizeof(obj),(void**)&ptr,0)))returnfalse;
memcpy(ptr,obj,sizeof(obj));
m_BackgroundBuffer->Unlock();
m_bIsBackgroundUsed=true;
returntrue;
}
//-----------------------------------------------------------------------------
//Name:
D3DGUIClass:
:
AddStaticText()
//Desc:
创建静态文本控件
//-----------------------------------------------------------------------------
boolD3DGUIClass:
:
AddStaticText(intid,wchar_t*text,floatx,floaty,unsignedlongcolor,intfontID)
{
if(!
text||fontID<0||fontID>=m_nTotalFontNum)returnfalse;
//下面的代码用于创建一个控件
if(!
m_pControls)
{
m_pControls=newGUICONTROL[1];
if(!
m_pControls)returnfalse;
memset(&m_pControls[0],0,sizeof(GUICONTROL));
}
else
{
GUICONTROL*temp;
temp=newGUICONTROL[m_nTotalControlNum+1];
if(!
temp)returnfalse;
memset(temp,0,sizeof(GUICONTROL)*
(m_nTotalControlNum+1));
memcpy(temp,m_pControls,
sizeof(GUICONTROL)*m_nTotalControlNum);
delete[]m_pControls;
m_pControls=temp;
}
//填充我们需要的静态文本信息
m_pControls[m_nTotalControlNum].m_type=UGP_GUI_STATICTEXT;
m_pControls[m_nTotalControlNum].m_id=id;
m_pControls[m_nTotalControlNum].m_color=color;
m_pControls[m_nTotalControlNum].m_xPos=x;
m_pControls[m_nTotalControlNum].m_yPos=y;
m_pControls[m_nTotalControlNum].m_listID=fontID;
//复制文本数据
intlen=wcslen(text);
m_pControls[m_nTotalControlNum].m_text=newwchar_t[len+1];
if(!
m_pControls[m_nTotalControlNum].m_text)returnfalse;
wcscpy(m_pControls[m_nTotalControlNum].m_text,text);
//m_pControls[m_nTotalControlNum].m_text[len]='\0';
//增量总数的计算
m_nTotalControlNum++;
returntrue;
}
//-----------------------------------------------------------------------------
//Name:
D3DGUIClass:
:
AddButton()
//Desc:
创建按钮控件的函数
//-----------------------------------------------------------------------------
boolD3DGUIClass:
:
AddButton(intid,floatx,floaty,wchar_t*up,wchar_t*over,wchar_t*down)
{
if(!
up||!
over||!
down)returnfalse;
if(!
m_pControls)
{
m_pControls=newGUICONTROL[1];
if(!
m_pControls)returnfalse;
memset(&m_pControls[0],0,sizeof(GUICONTROL));
}
else
{
GUICONTROL*temp;
temp=newGUICONTROL[m_nTotalControlNum+1];
if(!
temp)returnfalse;
memset(temp,0,sizeof(GUICONTROL)*
(m_nTotalControlNum+1));
memcpy(temp,m_pControls,
sizeof(GUICONTROL)*m_nTotalControlNum);
delete[]m_pControls;
m_pControls=temp;
}
//Setallthedataneededtorender/processabutton.
m_pControls[m_nTotalControlNum].m_type=UGP_GUI_BUTTON;
m_pControls[m_nTotalControlNum].m_id=id;
m_pControls[m_nTotalControlNum].m_xPos=x;
m_pControls[m_nTotalControlNum].m_yPos=y;
m_pControls[m_nTotalControlNum].m_listID=m_nTotalBufferNum;
//从文件加载纹理
if(D3DXCreateTextureFromFile(m_pd3dDevice,up,&m_pControls[m_nTotalControlNum].m_upTex)!
=D3D_OK)
{
returnfalse;
}
if(D3DXCreateTextureFromFile(m_pd3dDevice,over,&m_pControls[m_nTotalControlNum].m_overTex)!
=D3D_OK)
{
returnfalse;
}
if(D3DXCreateTextureFromFile(m_pd3dDevice,down,&m_pControls[m_nTotalControlNum].m_downTex)!
=D3D_OK)
{
returnfalse;
}
unsignedlongwhite=D3DCOLOR_XRGB(255,255,255);
//获取一下图形的宽度和高度
D3DSURFACE_DESCdesc;
m_pControls[m_nTotalControlNum].m_upTex->GetLevelDesc(0,&desc);
floatw=(float)desc.Width;
floath=(float)desc.Height;
m_pControls[m_nTotalControlNum].m_width=w;
m_pControls[m_nTotalControlNum].m_height=h;
GUIVERTEXobj[]=
{
{w+x,0+y,0.0f,1,white,1.0f,0.0f},
{w+x,h+y,0.0f,1,white,1.0f,1.0f},
{0+x,0+y,0.0f,1,white,0.0f,0.0f},
{0+x,h+y,0.0f,1,white,0.0f,1.0f},
};
//创建顶点缓存
if(!
m_pVertexBuffer)
{
m_pVertexBuffer=newLPDIRECT3DVERTEXBUFFER9[1];
if(!
m_pVertexBuffer)returnfalse;
}
else
{
LPDIRECT3DVERTEXBUFFER9*temp;
temp=newLPDIRECT3DVERTEXBUFFER9[m_nTotalBufferNum+1];
if(!
temp)returnfalse;
memcpy(temp,m_pVertexBuffer,
sizeof(LPDIRECT3DVERTEXBUFFER9)*m_nTotalBufferNum);
delete[]m_pVertexBuffer;
m_pVertexBuffer=temp;
}
if(FAILED(m_pd3dDevice->CreateVertexBuffer(sizeof(obj),0,
D3DFVF_GUI,D3DPOOL_DEFAULT,&m_pVertexBuffer[m_nTotalBufferNum],NULL)))
{
returnfalse;
}
//填充顶点缓存
void*ptr;
if(FAILED(m_pVertexBuffer[m_nTotalBufferNum]->Lock(0,sizeof(obj),(void**)&ptr,0)))
{
returnfalse;
}
memcpy(ptr,obj,sizeof(obj));
m_pVertexBuffer[m_nTotalBufferNum]->Unlock();
//自增
m_nTotalBufferNum++;
//自增
m_nTotalControlNum++;
returntrue;
}
//-----------------------------------------------------------------------------
//Name:
D3DGUIClass:
:
ClearUp()
//Desc:
清理门户释放资源的函数
//-----------------------------------------------------------------------------
voidD3DGUIClass:
:
ClearUp()
{
//清理门户,释放所有的资源
if(m_bIsBackgroundUsed)
{
if(m_Background.m_Background)
m_Background.m_Background->Release();
if(m_BackgroundBuffer)
m_BackgroundBuffer->Release();
}
m_Background.m_Background=NULL;
m_BackgroundBuffer=NULL;
for(inti=0;i{
if(m_pFonts[i])
{
m_pFonts[i]->Release();
m_pFonts[i]=NULL;
}
}
if(m_pFonts)delete[]m_pFonts;
m_pFonts=NULL;
m_nTotalFontNum=0;
for(inti=0;i{
if(m_pVertexBuffer[i])
{
m_pVertexBuffer[i]->Release();
m_pVertexBuffer[i]=NULL;
}
}
if(m_pVertexBuffer)delete[]m_pVertexBuffer;
m_pVertexBuffer=NULL;
m_nTotalBufferNum=0;
for(inti=0;i{
if(m_pControls[i].m_Background)
{
m_pControls[i].m_Background->Release();
m_pControls[i].m_Background=NULL;
}
if(m_pControls[i].m_upTex)
{
m_pControls[i].m_upTex->Release();
m_pControls[i].m_upTex=NULL;
}
if(m_pControls[i].m_downTex)
{
m_pControls[i].m_downTex->Release();
m_pControls[i].m_downTex=NULL;
}
if(m_pControls[i].m_overTex)
{
m_pControls[i].m_overTex->Release();
m_pControls[i].m_overTex=NULL;
}
if(m_pControls[i].m_text)
{
delete[]m_pControls[i].m_text;
m_pControls[i].m_text=NULL;
}
}
if(m_pControls)delete[]m_pControls;
m_pControls=NULL;
m_nTotalControlNum=0;
}
//-----------------------------------------------------------------------------
//Name:
ProcessGUI
//Desc:
全局的函数,封装渲染整个GUI系统,同样还为控件调用回调函数
//-----------------------------------------------------------------------------
voidProcessGUI(D3DGUIClass*gui,boolLMBDown,intmouseX,intmouseY,void(*funcPtr)(intid,intstate))
{
if(!
gui)return;
LPDIRECT3DDEVICE9device=gui->GetD3dDevice();
if(!
device)return;
//绘制背景
GUICONTROL*Background=gui->GetBackground();
LPDIRECT3DVERTEXBUFFER9bdBuffer=gui->GetBackgroundBuffer();
//已经创建出的东西才绘制,所以来个if
if(gui->IsBackgroundUsed()&&Background&&bdBuffer)
{
device->SetTexture(0,Background->m_Background);
device->SetStreamSource(0,bdBuffer,0,sizeof(GUIVERTEX));
device->SetFVF(D3DFVF_GUI);
device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
device->SetTexture(0,NULL);
}
//用来显示文本的对象
LPD3DXFONTpFont=NULL;
RECTfontPosition={0,0,(long)gui->GetWindowWidth(),
(long)gui->GetWindowHeig