?? 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 + -