📄 asl_gui.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 + -