⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 button.cpp

📁 一个自己写的游戏引擎,用DirectX 写成
💻 CPP
字号:
//--------------------------------------------------
//  Desc: BUTTON
//  Author: artsylee/2006.11.16
//--------------------------------------------------
#include "../stdafx.h"
#include "Button.h"
#include "../Core/Common.h"
#include "../Core/Input.h"
#include "../Core/IniFile.h"
#include "../Core/Graphics.h"
#include "../Core/TextureManager.h"
#include "../Core/Message.h"
#include "../Core/Interface.h"

Button::Button(CWindow* pParent):CWindow(pParent)
{
	m_dwGUIType = GUI_BUTTON;
	m_State = BTN_NORMAL;
	m_bMouseOn = false;
	m_StateNum = BTN_STATENUM;
}

Button::~Button()
{
	// 基类释放
}

bool Button::LoadFromIni(char* pfilename, char* pIndex)
{
	CIniFile ui(pfilename);
	m_dwID = ui.ReadDWORD(pIndex, "ID");
	m_ptPos = ui.ReadPoint(pIndex, "Position");
	m_rcSrc = ui.ReadRect(pIndex, "SrcRect");
	m_dwColor = ui.ReadDWORD(pIndex, "Color", 0xffffffff);
	m_dwAttrib = ui.ReadDWORD(pIndex, "Attrib", 10);
	m_bUseRgn = ui.ReadBOOL(pIndex, "UseRGN", m_bUseRgn);
	ui.ReadString(pIndex, "Caption", m_szCaption);
	ui.ReadString(pIndex, "File", m_szUIPath);
	DWORD index = ui.ReadDWORD(pIndex, "Picture");
	if(ui.IsReadSucceed())
	{
		m_hTexture = g_pTextureManager->LoadAMFTexture(m_szUIPath, index);
		GRect zeroRc(0, 0, 0, 0);
		if(m_rcSrc==zeroRc)
		{
			CTexture * ptex = g_pTextureManager->GetTexture(m_hTexture);
			if(ptex)
			{
				m_rcSrc.SetRect(0, 0, ptex->GetWidth(), ptex->GetHeight());
			}
		}
	}
	m_StateNum = ui.ReadInt(pIndex, "StateNum", m_StateNum);
	for(int i=0; i<BTN_STATENUM; i++)
	{
		m_DstRect[i].SetRectWH(0, i*(m_rcSrc.Height()/m_StateNum), m_rcSrc.Width(), m_rcSrc.Height()/m_StateNum);
	}
	m_Width = m_DstRect[BTN_NORMAL].Width();
	m_Height = m_DstRect[BTN_NORMAL].Height();
	if(m_hTexture && m_bUseRgn)
	{
		CreateRGN(&m_DstRect[BTN_NORMAL]);
	}
	if(m_pParent)
	{
		OffSet(m_pParent->GetRect().left, m_pParent->GetRect().top);
	}
	if(m_dwAttrib & GUI_ENABLE)
	{
		m_State = BTN_NORMAL;
	}
	else
	{
		m_State = BTN_DISABLE;
	}
	return true;
}

void Button::Render()
{
	if(m_dwAttrib & GUI_VISIBLE)
	{
		g_pGraphics->RenderSprite(m_hTexture, m_ptPos.x, m_ptPos.y, &m_DstRect[m_State], m_dwColor);
		DrawSingleLine(m_ptPos.x+m_Width/2, m_ptPos.y+m_Height/2, 0xffffffff, true, m_szCaption);
	}
}

DWORD Button::ProcessEvent()
{
	if(!(m_dwAttrib & GUI_VISIBLE) || !(m_dwAttrib & GUI_ENABLE) || m_hTexture==INVALID_HANDLE)
	{
		return INVALID_ID;
	}
	GRect rcPos;
	rcPos.SetRectWH(m_ptPos.x, m_ptPos.y, m_Width, m_Height);
	if(CheckInRGN(rcPos))
	{
		if(!m_bMouseOn)
		{
			//发送Mouseon信息
			CMessage msg(MSG_SYS_GUI, m_dwID);
			msg.SetParameter(GUI_MOUSE_OVER, m_dwGUIType, this);
			PostMessage(msg);
			m_bMouseOn = true;
			m_State = BTN_OVER;
		}
				
		if(g_stInputInfo.MouseValue==LB_DOWN)
		{
			m_State = BTN_DOWN;
			//发送MOUSEDOWN信息
			CMessage msg(MSG_SYS_GUI, m_dwID);
			msg.SetParameter(GUI_MOUSE_LDOWN, m_dwGUIType, this);
			PostMessage(msg);
		}
		if(g_stInputInfo.MouseValue==LB_UP)
		{
			m_State = BTN_OVER;
			//发送MOUSEUP信息
			CMessage msg(MSG_SYS_GUI, m_dwID);
			msg.SetParameter(GUI_MOUSE_LUP, m_dwGUIType, this);
			PostMessage(msg);
		}
		if(!g_Input.GetMousePtr()->IsKeyDown(LBUTTON))
		{
			m_State = BTN_OVER;
		}
		return m_dwID;
	}
	else
	{
		if(m_bMouseOn)
		{
			//发送MouseLOST信息
			CMessage msg(MSG_SYS_GUI, m_dwID);
			msg.SetParameter(GUI_LOST_FOCUS, m_dwGUIType, this);
			PostMessage(msg);
			m_bMouseOn = false;
			m_State = BTN_NORMAL;
		}
		
		return INVALID_ID;
	}
}

void Button::Enable()
{
	if(!(m_dwAttrib & GUI_ENABLE))
	{
		m_bMouseOn = false;
		m_State = BTN_NORMAL;
		m_dwAttrib |= GUI_ENABLE;
	}
}

void Button::Disable()
{
	if(m_dwAttrib & GUI_ENABLE)
	{
		m_bMouseOn =false;
		m_State = BTN_DISABLE;
		m_dwAttrib &= ~GUI_ENABLE;
	}
}

void Button::Show(bool c)
{
	CWindow::Show(c);
	if(m_dwAttrib & GUI_ENABLE)
	{
		m_State = BTN_NORMAL;
	}
	else
	{
		m_State = BTN_DISABLE;
	}
	m_bMouseOn = false;
}


CoolButton::CoolButton(CWindow* pParent /* = NULL */):Button(pParent)
{
	m_dwGUIType = GUI_COOLBUTTON;
	m_State = BTN_NORMAL;
	m_bMouseOn = false;
	m_StateNum = BTN_STATENUM;
}

CoolButton::~CoolButton()
{
	// 基类释放
}

bool CoolButton::LoadFromIni(char* pfilename, char* pIndex)
{
	if(Button::LoadFromIni(pfilename, pIndex))
	{
		m_Font.CreateFont(12, 0, 0, 0, FW_BOLD, 
			FALSE, FALSE, FALSE,
			OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE,
			"宋体");

		m_Center = CWindow::GetRGNCenter();

		return true;
	}
	return false;
}

void CoolButton::Render()
{
	if(m_dwAttrib & GUI_VISIBLE)
	{
		g_pGraphics->BeginSprite();
		if(m_State == BTN_NORMAL)
		{
			g_pGraphics->RenderSprite(m_hTexture, m_ptPos.x, m_ptPos.y, &m_DstRect[BTN_NORMAL], m_dwColor);
			m_Font.DrawText(m_ptPos.x+m_Width/2, m_ptPos.y+m_Height/3+2, 0xffffff00, true, m_szCaption);
			//m_Font.DrawText(m_ptPos.x+m_Center.x, m_ptPos.y+m_Center.y, 0xffffff00, true, m_szCaption);
		}
		else if(m_State == BTN_OVER)
		{
			g_pGraphics->RenderSprite(m_hTexture, m_ptPos.x, m_ptPos.y, &m_DstRect[BTN_NORMAL], m_dwColor);
			g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
			g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTALPHA);
			g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
			g_pGraphics->RenderSprite(m_hTexture, m_ptPos.x, m_ptPos.y, &m_DstRect[BTN_OVER], m_dwColor);
			m_Font.DrawText(m_ptPos.x+m_Width/2, m_ptPos.y+m_Height/3+2, 0xffffffff, true, m_szCaption);
			//m_Font.DrawText(m_ptPos.x+m_Center.x, m_ptPos.y+m_Center.y, 0xffffffff, true, m_szCaption);
		}
		else if(m_State == BTN_DOWN)
		{
			g_pGraphics->RenderSprite(m_hTexture, m_ptPos.x, m_ptPos.y, &m_DstRect[BTN_DOWN], m_dwColor);
			g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
			g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTALPHA);
			g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
			g_pGraphics->RenderSprite(m_hTexture, m_ptPos.x, m_ptPos.y, &m_DstRect[BTN_OVER], m_dwColor);
			m_Font.DrawText(m_ptPos.x+m_Width/2-1, m_ptPos.y+m_Height/3+2+2, 0xffffffff, true, m_szCaption);
			//m_Font.DrawText(m_ptPos.x+m_Center.x-1, m_ptPos.y+m_Center.y+2, 0xffffffff, true, m_szCaption);
		}
		else if(m_State == BTN_DISABLE)
		{
			g_pGraphics->RenderSprite(m_hTexture, m_ptPos.x, m_ptPos.y, &m_DstRect[BTN_DISABLE], m_dwColor);
			m_Font.DrawText(m_ptPos.x+m_Width/2, m_ptPos.y+m_Height/3+2, 0x7f9f9f9f, true, m_szCaption);
			//m_Font.DrawText(m_ptPos.x+m_Center.x, m_ptPos.y+m_Center.y, 0x7f9f9f9f, true, m_szCaption);
		}
		g_pGraphics->EndSprite();
		if(m_State == BTN_OVER || m_State == BTN_DOWN)
		{
			g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
			g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -