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

📄 asl_gui.cpp

📁 泡泡堂单机版(含ASL游戏引擎源码 泡泡堂单机版(含ASL游戏引擎源码
💻 CPP
字号:
//-----------------------------------------------------------------------------
//
//    ____ Azure Star Game Engine 蓝星游戏引擎 ____
//
//    Copyright (c) 2006, 蓝星工作室
//    All rights reserved.
//
//    文件名称: asl_gui.cpp
//    摘    要: GUI系统类实现
//
//    当前版本: 1.0
//    作    者: 汤  祺
//    创建日期: 2006-8-12
//
//-----------------------------------------------------------------------------

#include "asl_gui.h"
#include "asl_input.h"

using namespace std;

namespace ASL
{

//-----------------------------------------------------------------------------
// 函数名: ASLGui::ASLGui()
// 功  能: 构造函数
// 参  数: [void] - 无
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
ASLGui::ASLGui(void) :
	m_pFocusedCtrl(NULL),
	m_pLockedCtrl(NULL),
	m_pHoveredCtrl(NULL),
	m_pbmCanvas(NULL)
{
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::~ASLGui()
// 功  能: 析构函数
// 参  数: [void] - 无
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
ASLGui::~ASLGui(void)
{
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::Instance()
// 功  能: 取全局唯一实例
// 参  数: [void] - 无
// 返回值: [ASLGui&] - 全局唯一实例
//-----------------------------------------------------------------------------
ASLGui& ASLGui::Instance(void)
{
	static ASLGui instance;
	return instance;
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::AddCtrl()
// 功  能: 注册控件
// 参  数: [*pCtrl] - 待注册的控件
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLGui::AddCtrl(ASLControl *pCtrl)
{
	list<ASLControl*>::iterator it;
	for (it = m_lstpCtrls.begin(); it != m_lstpCtrls.end(); ++it)
	{
		if ((*it) == pCtrl)
		{
			return;
		}
	}
	m_lstpCtrls.push_back(pCtrl);
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::DelCtrl()
// 功  能: 注销控件
// 参  数: [*pCtrl] - 待注销的控件
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLGui::DelCtrl(ASLControl *pCtrl)
{
	list<ASLControl*>::iterator it;
	for (it = m_lstpCtrls.begin(); it != m_lstpCtrls.end(); ++it)
	{
		if ((*it) == pCtrl)
		{
			m_lstpCtrls.erase(it);
			
			if (m_pFocusedCtrl == pCtrl)
			{
				m_pFocusedCtrl = NULL;
			}
			if (m_pLockedCtrl == pCtrl)
			{
				m_pLockedCtrl = NULL;
			}
			if (m_pHoveredCtrl == pCtrl)
			{
				m_pHoveredCtrl = NULL;
			}
			return;
		}
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::AddRadio()
// 功  能: 添加单选按钮
// 参  数: [*pRadio] - 待添加的单选按钮
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLGui::AddRadio(ASLRadioButton *pRadio)
{
	list<ASLRadioButton*>::iterator it;
	for (it = m_lstpRadios.begin(); it != m_lstpRadios.end(); ++it)
	{
		if ((*it) == pRadio)
		{
			return;
		}
	}
	m_lstpRadios.push_back(pRadio);
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::DelRadio()
// 功  能: 删除单选按钮
// 参  数: [*pRadio] - 待删除的单选按钮
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLGui::DelRadio(ASLRadioButton *pRadio)
{
	list<ASLRadioButton*>::iterator it;
	for (it = m_lstpRadios.begin(); it != m_lstpRadios.end(); ++it)
	{
		if ((*it) == pRadio)
		{
			m_lstpRadios.erase(it);
			return;
		}
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::CheckRadio()
// 功  能: 选中单选按钮, 退选同组按钮
// 参  数: [*pRadio] - 要选中的单选按钮
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLGui::CheckRadio(ASLRadioButton *pRadio)
{
	list<ASLRadioButton*>::iterator it;
	for (it = m_lstpRadios.begin(); it != m_lstpRadios.end(); ++it)
	{
		if ((*it)->GetGroup() == pRadio->GetGroup() && (*it) != pRadio)
		{
			(*it)->UnCheck();
		}
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::SetFocus()
// 功  能: 设定焦点控件
// 参  数: [*pCtrl] - 要取得焦点的控件
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLGui::SetFocus(ASLControl *pCtrl)
{
	if (m_pFocusedCtrl == pCtrl)
	{
		return;
	}

	if (m_pFocusedCtrl != NULL)
	{
		m_pFocusedCtrl->Leave();
	}

	m_pFocusedCtrl = pCtrl;
	if (pCtrl != NULL)
	{
		m_pFocusedCtrl->Enter();
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::Update()
// 功  能: 更新GUI系统
// 参  数: [fDelta] - 自上次更新后到现在的时间(单位: 秒)
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLGui::Update(float fDelta)
{
	ASLControl *pCurrent;
	list<ASLControl*>::iterator it;

	// 调用各控件的更新函数
	for (it = m_lstpCtrls.begin(); it != m_lstpCtrls.end(); ++it)
	{
		(*it)->Update(fDelta);
	}

	// 若存在焦点控件, 则处理焦点控件的键盘事件
	if (m_pFocusedCtrl != NULL)
	{
		queue<DWORD> qKeyDown = INPUT.GetKeyDown();
		queue<DWORD> qKeyUp = INPUT.GetKeyUp();
		queue<char> qChar = INPUT.GetChar();
		ShiftState ss = INPUT.GetShiftState();

		while (!qKeyDown.empty())
		{
			m_pFocusedCtrl->KeyDown(qKeyDown.front(), ss);
			qKeyDown.pop();
		}

		while (!qKeyUp.empty())
		{
			m_pFocusedCtrl->KeyUp(qKeyUp.front(), ss);
			qKeyUp.pop();
		}

		while (!qChar.empty())
		{
			m_pFocusedCtrl->KeyPress(qChar.front());
			qChar.pop();
		}
	}

	// 若存在被锁定控件, 则仅处理被锁定的控件
	if (m_pLockedCtrl != NULL)
	{
		pCurrent = m_pLockedCtrl;
		if (!INPUT.GetMouseState(mbLeft))
		{
			m_pLockedCtrl = NULL;
		}

		if (m_pHoveredCtrl == pCurrent && !pCurrent->IsPointIn(INPUT.GetMousePos()))
		{
			pCurrent->MouseLeave();
			m_pHoveredCtrl = NULL;
		}
		else if (m_pHoveredCtrl == NULL && pCurrent->IsPointIn(INPUT.GetMousePos()))
		{
			pCurrent->MouseEnter();
			m_pHoveredCtrl = pCurrent;
		}

        ProcessMouseEvent(pCurrent);
	}
	else
	{
		// 反向处理控件链表, 确保上层控件优先处理
		list<ASLControl*>::reverse_iterator rit;
		for (rit = m_lstpCtrls.rbegin(); rit != m_lstpCtrls.rend(); ++rit)
		{
			pCurrent = (*rit);

			// 仅处理有效可见且鼠标位于控件内的控件
			if (pCurrent != NULL && pCurrent->IsEnabled() && 
				pCurrent->IsVisible() && pCurrent->IsPointIn(INPUT.GetMousePos()))
			{
				if (m_pHoveredCtrl != pCurrent)
				{
					if (m_pHoveredCtrl != NULL)
					{
						m_pHoveredCtrl->MouseLeave();
					}
					m_pHoveredCtrl = pCurrent;
					m_pHoveredCtrl->MouseEnter();
				}

                ProcessMouseEvent(pCurrent);
				return;
			}
		}

		// 鼠标不在任何有效可见控件内
		if (m_pHoveredCtrl != NULL)
		{
			m_pHoveredCtrl->MouseLeave();
			m_pHoveredCtrl = NULL;
		}
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::Draw()
// 功  能: 将GUI系统绘制到屏幕上
// 参  数: [void] - 无
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLGui::Draw(void)
{
	list<ASLControl*>::iterator it;
	for (it = m_lstpCtrls.begin(); it != m_lstpCtrls.end(); ++it)
	{
		if ((*it) != NULL && (*it)->IsVisible())
		{
			(*it)->Draw();
		}
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLGui::ProcessMouseEvent()
// 功  能: 处理控件的鼠标事件
// 参  数: [*pCtrl] - 待处理控件的指针
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLGui::ProcessMouseEvent(ASLControl *pCtrl)
{
	if (INPUT.IsMouseJustDown(mbLeft))
	{
		m_pLockedCtrl = pCtrl;
		if (pCtrl->CanHaveFocus())
		{
			SetFocus(pCtrl);
		}
		pCtrl->MouseDown(INPUT.GetMousePos(), mbLeft);
	}

	if (INPUT.IsMouseJustDown(mbRight))
	{
		pCtrl->MouseDown(INPUT.GetMousePos(), mbRight);
	}

	if (INPUT.IsMouseJustDown(mbMiddle))
	{
		pCtrl->MouseDown(INPUT.GetMousePos(), mbMiddle);
	}

	if (INPUT.IsMouseJustUp(mbLeft))
	{
		pCtrl->MouseUp(INPUT.GetMousePos(), mbLeft);
	}

	if (INPUT.IsMouseJustUp(mbRight))
	{
		pCtrl->MouseUp(INPUT.GetMousePos(), mbRight);
	}

	if (INPUT.IsMouseJustUp(mbMiddle))
	{
		pCtrl->MouseUp(INPUT.GetMousePos(), mbMiddle);
	}

	if (INPUT.IsMouseMoved())
	{
		pCtrl->MouseMove(INPUT.GetMousePos());
	}
}

} // namespace ASL

⌨️ 快捷键说明

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