?? asl_guiobj.h
字號:
//-----------------------------------------------------------------------------
//
// ____ Azure Star Game Engine 藍星游戲引擎 ____
//
// Copyright (c) 2006, 藍星工作室
// All rights reserved.
//
// 文件名稱: asl_guiobj.h
// 摘 要: 各種GUI控件類定義
//
// 當前版本: 1.0
// 作 者: 湯 祺
// 創建日期: 2006-8-12
//
//-----------------------------------------------------------------------------
#ifndef ASL_GUIOBJ_INCLUDE
#define ASL_GUIOBJ_INCLUDE
#pragma once
#include "asl_utils.h"
#include "asl_font.h"
#include "asl_input.h"
#include <vector>
#include <list>
#include <string>
//-----------------------------------------------------------------------------
namespace ASL
{
//-----------------------------------------------------------------------------
// 類的前向聲明
//-----------------------------------------------------------------------------
class ASLControl;
//-----------------------------------------------------------------------------
// 事件處理函數及包裹結構
//-----------------------------------------------------------------------------
typedef void (ASLControl::*NotifyFun)(void);
struct NotifyEvent
{
NotifyEvent() : function(NULL), invoker(NULL) {}
NotifyFun function;
ASLControl *invoker;
};
typedef void (ASLControl::*MouseMoveFun)(POINT pt);
struct MouseMoveEvent
{
MouseMoveEvent() : function(NULL), invoker(NULL) {}
MouseMoveFun function;
ASLControl *invoker;
};
typedef void (ASLControl::*MouseFun)(POINT pt, MouseButton mb);
struct MouseEvent
{
MouseEvent() : function(NULL), invoker(NULL) {}
MouseFun function;
ASLControl *invoker;
};
typedef void (ASLControl::*KeyFun)(DWORD dwKey, ShiftState ss);
struct KeyEvent
{
KeyEvent() : function(NULL), invoker(NULL) {}
KeyFun function;
ASLControl *invoker;
};
typedef void (ASLControl::*KeyPressFun)(char cKey);
struct KeyPressEvent
{
KeyPressEvent() : function(NULL), invoker(NULL) {}
KeyPressFun function;
ASLControl *invoker;
};
//-----------------------------------------------------------------------------
// 用戶通過使用這組宏將自定義事件處理函數與控件捆綁起來.
//-----------------------------------------------------------------------------
#define ON_MOUSEENTER(obj, fun) \
{ \
(obj)->OnMouseEnter.function = NotifyFun(fun); \
(obj)->OnMouseEnter.invoker = this; \
}
#define ON_MOUSELEAVE(obj, fun) \
{ \
(obj)->OnMouseLeave.function = NotifyFun(fun); \
(obj)->OnMouseLeave.invoker = this; \
}
#define ON_MOUSEMOVE(obj, fun) \
{ \
(obj)->OnMouseMove.function = MouseMoveFun(fun); \
(obj)->OnMouseMove.invoker = this; \
}
#define ON_MOUSEDOWN(obj, fun) \
{ \
(obj)->OnMouseDown.function = MouseFun(fun); \
(obj)->OnMouseDown.invoker = this; \
}
#define ON_MOUSEUP(obj, fun) \
{ \
(obj)->OnMouseUp.function = MouseFun(fun); \
(obj)->OnMouseUp.invoker = this; \
}
#define ON_KEYDOWN(obj, fun) \
{ \
(obj)->OnKeyDown.function = KeyFun(fun); \
(obj)->OnKeyDown.invoker = this; \
}
#define ON_KEYUP(obj, fun) \
{ \
(obj)->OnKeyUp.function = KeyFun(fun); \
(obj)->OnKeyUp.invoker = this; \
}
#define ON_KEYPRESS(obj, fun) \
{ \
(obj)->OnKeyPress.function = KeyPressFun(fun); \
(obj)->OnKeyPress.invoker = this; \
}
#define ON_ENTER(obj, fun) \
{ \
(obj)->OnEnter.function = NotifyFun(fun); \
(obj)->OnEnter.invoker = this; \
}
#define ON_LEAVE(obj, fun) \
{ \
(obj)->OnLeave.function = NotifyFun(fun); \
(obj)->OnLeave.invoker = this; \
}
#define ON_CLICK(obj, fun) \
{ \
(obj)->OnClick.function = NotifyFun(fun); \
(obj)->OnClick.invoker = this; \
}
#define ON_CHANGE(obj, fun) \
{ \
(obj)->OnChange.function = NotifyFun(fun); \
(obj)->OnChange.invoker = this; \
}
#define ON_SCROLL(obj, fun) \
{ \
(obj)->OnScroll.function = NotifyFun(fun); \
(obj)->OnScroll.invoker = this; \
}
//-----------------------------------------------------------------------------
// 類名: ASLControl
// 功能: 控件類定義
// 本類是所有控件的基類, 提供的抽象接口被ASLGui類調用, 通過與該類的合作
// 實現整個GUI系統.
// 本類的核心是提供了兩個級別的事件處理能力. 第一級是控件級, 本類提供了
// 一組事件處理虛函數, 當事件發生時會被ASLGui類調用. 各子類可以根據需要
// 改寫這些函數, 以實現各自的功能; 第二級是用戶級, 本類提供用戶處理事件
// 的函數指針. 用戶可以自己撰寫事件處理函數, 同時把函數地址賦給控件的函
// 指針. 各控件在處理完實現自身功能的事件后, 將會調用用戶的事件處理函數.
//-----------------------------------------------------------------------------
class ASLControl
{
// 構造, 析構函數
public:
ASLControl(void);
virtual ~ASLControl(void);
// 禁用拷貝構造函數和賦值函數, 無實現
private:
ASLControl(const ASLControl&);
ASLControl& operator=(const ASLControl&);
// 公有方法
public:
// 繪圖函數, 子類必須改寫
virtual void Draw(void) const = 0;
// 更新函數
virtual void Update(float fDelta) {}
// 是否可以獲得焦點. 獲得焦點的控件可以處理鍵盤事件
virtual bool CanHaveFocus() const { return true; }
// 事件處理函數, 子類可根據需要改寫, 但必須在改寫函數中調用本類的同名函數
// 所傳入的鼠標指針位置是相對于程序窗口的.
public:
// 鼠標進入
virtual void MouseEnter(void);
// 鼠標離開
virtual void MouseLeave(void);
// 鼠標移動
virtual void MouseMove(POINT pt);
// 鼠標按下
virtual void MouseDown(POINT pt, MouseButton mb);
// 鼠標彈起
virtual void MouseUp(POINT pt, MouseButton mb);
// 鍵盤按下
virtual void KeyDown(DWORD dwKey, ShiftState ss);
// 鍵盤彈起
virtual void KeyUp(DWORD dwKey, ShiftState ss);
// 字符按下
virtual void KeyPress(char cKey);
// 獲得焦點
virtual void Enter(void);
// 失去焦點
virtual void Leave(void);
// 非虛函數, 提供公共的操作
public:
// 創建控件, 在ASLGui類的唯一實例中注冊本控件
void Create(void);
// 設置父控件
void SetParent(ASLControl *pParent);
// 添加子控件
void AddChild(ASLControl* pChild);
// 刪除子控件
void DelChild(ASLControl* pChild);
// 使控件有效
void Enable(void);
// 使控件無效
void Disable(void);
// 顯示控件
void Show(void);
// 隱藏控件
void Hide(void);
// 控件坐標轉屏幕(程序窗口)坐標
void ClientToScreen(POINT &pt) const;
// 屏幕(程序窗口)坐標轉控件坐標
void ScreenToClient(POINT &pt) const;
// 一點是否在控件內
bool IsPointIn(POINT pt) const;
// 使控件獲得焦點
void SetFocus(void);
// 控件是否有效
bool IsEnabled(void) const { return m_bEnabled; }
// 控件是否可見
bool IsVisible(void) const { return m_bVisible; }
// 控件是否獲得焦點
bool IsFocused(void) const { return m_bFocused; }
// 設置控件距父控件左側距離
void SetLeft(int nLeft) { m_nLeft = nLeft; }
// 設置控件距父控件頂端距離
void SetTop(int nTop) { m_nTop = nTop; }
// 取控件距父控件左側距離
int GetLeft(void) const { return m_nLeft; }
// 取控件距父控件頂端距離
int GetTop(void) const { return m_nTop; }
// 設置控件寬度
void SetWidth(int nWidth) { m_nWidth = nWidth; }
// 設置控件高度
void SetHeight(int nHeight) { m_nHeight = nHeight; }
// 取控件寬度
int GetWidth(void) const { return m_nWidth; }
// 取控件高度
int GetHeight(void) const { return m_nHeight; }
// 設置控件字體
void SetFont(ASLFont &fnt) { m_pFont = &fnt; }
// 設置控件字體顏色
void SetFontColor(COLOR cl) { m_clFontColor = cl; }
// 取控件字體
ASLFont* GetFont(void) const { return m_pFont; }
// 取控件字體顏色
COLOR GetFontColor(void) const { return m_clFontColor; }
// 設置控件標題
void SetCaption(LPCSTR szCaption) { m_strCaption = szCaption; }
// 取控件標題
LPCSTR GetCaption(void) const { return m_strCaption.c_str(); }
// 用戶自定義的事件處理函數指針
// 所傳入的鼠標指針位置是相對于父控件的.
public:
NotifyEvent OnMouseEnter;
NotifyEvent OnMouseLeave;
MouseMoveEvent OnMouseMove;
MouseEvent OnMouseDown;
MouseEvent OnMouseUp;
KeyEvent OnKeyDown;
KeyEvent OnKeyUp;
KeyPressEvent OnKeyPress;
NotifyEvent OnEnter;
NotifyEvent OnLeave;
// 控件屬性
protected:
ASLControl* m_pParent; // 父控件指針
int m_nLeft; // 距父控件左側距離
int m_nTop; // 距父控件頂端距離
int m_nWidth; // 寬度
int m_nHeight; // 高度
bool m_bEnabled; // 是否有效
bool m_bVisible; // 是否可見
bool m_bFocused; // 是否獲得焦點
ASLFont* m_pFont; // 字體
COLOR m_clFontColor; // 字體顏色
std::string m_strCaption; // 標題
std::list<ASLControl*> m_lChildren; // 子控件鏈表
public:
int Tag; // 用于用戶自定義數據
}; // ASLControl 類定義結束
//-----------------------------------------------------------------------------
// 類名: ASLWinControl
// 功能: 窗體控件類
// 本類是面板類(ASLPanel)和窗體類(ASLForm)的純虛基類, 提供了設置和使用
// 背景圖片的能力.
// 本類主要作用是作為一個控件容器. 對象的所有子控件將共享對象的有效性和
// 可見性. 由于子控件使用相對于父類的坐標系, 所有子控件將隨其父控件一起
// 移動而保持相對位置不變.
//-----------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -