📄 gui.h
字号:
/**********************************************
GUI对象的基础类
**********************************************/
#ifndef CORE_GUIOBJECT_H
#define CORE_GUIOBJECT_H
#pragma once
#include "GUIDefine.h"
#include "ResourceManager.h"
#ifndef WM_MOUSEWHEEL
#define WM_MOUSEWHEEL 0x020A
#endif
// Graphical User Interface
class GUI :
public BaseObject
{
/////////////////////////全局静态数据成员和函数/////////////////////////
protected:
static CORE* m_pCORE;
static HWND m_hWnd; ///窗口的句柄
static GUIRect m_rcRootRect; ///根对象区域
static GUIRect m_rcClipRect; ///剪裁区域
static GUIPoint m_ptMousePos; ///鼠标位置
static DWORD m_dwLastMouseMoveTime; ///上次鼠标移动的时间
static GUI* m_pRootGUI; ///哪个是根对象?左上角坐标为窗口坐标
static GUI* m_pCurMouseGUI; ///当前鼠标移动到了哪个对象上?
static GUI* m_pCurKeyboardGUI; ///当前响应键盘消息的对象
static GUI* m_pLButtonDownGUI; ///左键按下时鼠标所在对象
static GUI* m_pRButtonDownGUI; ///右键按下时鼠标所在对象
static GUI* m_pMButtonDownGUI; ///中键按下时鼠标所在对象
public:
static void InitGUIEngine(CORE* pCORE,GUI *pRootGUI); ///初始化类,设置一些静态的成员,设置根对象
static void EndGUIEngine(); ///结束GUI引擎
static void SetEditFocusObject(GUI *pKeyboardGUI); ///设置编辑焦点对象(只有这个对象可以接受到键盘消息)
static GUI* GetEditFocusObject(); ///获得编辑焦点对象(只有这个对象可以接受到键盘消息)
static void SetRootRect(GUIRect &rcRootRect); ///重新设置根对象区域
static GUIRect& GetRootRect(); ///返回根对象区域
static void GUIResize(RECT& rcWnd); ///动态改变窗口大小。该函数会自动修改引擎核心参数。注意:不能在窗口消息回调函数与GUI::Render()函数中使用。
///////////////////////////普通数据成员和函数///////////////////////////
public:
GUI(void);
virtual ~GUI(void);
////////////////////////基本属性//////////////////////
protected:
union
{
DWORD m_dwAttrib; ///对象属性,方便拷贝
struct
{
BYTE m_bVision:1; ///是否显示
BYTE m_bPause:1; ///是否暂停
BYTE m_bClipdraw:1; ///是否剪裁绘制(影响子对象)
BYTE m_bNull:1; ///是否是一个空框架
BYTE m_bEditFocus:1; ///是否有编辑焦点
};
};
public:
void SetVisible(bool bVision); ///显示或隐藏
bool IsVisible(); ///是否显示
void SetPause(bool bPause); ///设置暂停
bool IsPause(); ///是否暂停
void SetClipdraw(bool bClipdraw); ///设置剪裁绘制
bool IsClipdraw(); ///是否剪裁绘制
void SetNull(bool bNull); ///设置为空框架
bool IsNull(); ///是否为空框架
void SetEditFocus(bool bFocus); ///设置是否编辑输入焦点
bool GetEditFocus(); ///是否编辑输入焦点
protected:
GUIPoint m_ptStartPosition; ///相对于自己的父对象,自己左上角偏移坐标
GUIPoint m_ptWorldPosition; ///相对于根对象左上角的坐标,为世界坐标
GUISize m_szGUISize; ///对象大小
char m_szGUIName[_MAX_PATH]; ///对象名字
public:
void SetStartPos(float x,float y); ///设置起始坐标,它将引发各子层的世界坐标也一起变化,为递归调用函数
GUIPoint* GetStartPos(); ///获取相对父层的左上角偏移位置
GUIPoint* GetWorldPos(); ///获取世界坐标
void SetGUISize(float w,float h,bool ReviseCurAniItem = false); ///设置对象大小
float GetWidth(); ///获取对象宽度
float GetHeight(); ///获取对象高度
void SetGUIName(char* lpszName); ///设置对象名字
char* GetGUIName(); ///获取对象名字
char* GetClassName(); ///获取类名
protected:
list <GUIPoint> m_MovePath; ///动画移动路径
public:
void AppendPathPoint(GUIPoint &pt); ///把路径点附加到移动队列末尾
void InsertPathPoint(GUIPoint &pt); ///把路径点附加到移动队列开头
void ClearPathPoint(); ///清除所有路径点,不再移动
// void DoAutoMove(); ///自动移动
void SmoothMoveTo(float x,float y,float framecount,bool bAppend=false); ///平滑移动到目标位置
bool IsMoving(); ///是否正在移动
virtual void OnMoveFinish(); ///当移动到路径的终点,加入函数处理,派生类可以在这里进行控制
protected:
st_Ani* m_pAni;
public:
st_Ani* GetCurAni(); ///获得当前动画数据
AniItem* GetCurAniItem(); ///获得当前动画项数据
void GoAniStart(bool bPlay,int nRepeat=-1); ///跳到动画开始(是否播放)
void GoAniItem(WORD nAniItem); ///跳转到动画某一项
void PlayAni(int nRepeat); ///开始播放动画(播放次数小于0时为循环播放)
void StopAni(); ///停止播放动画
///////////////////////////创建GUI/////////////////////////////
public:
bool CreateGUI(char* lpszName,float w,float h,GUI* pParent);
bool FromAni(char* lpszName,const char* lpszAniResName,float w,float h,GUI* pParent);
bool FromPic(char* lpszName,const char* lpszPicResName,float tx,float ty,float tw,float th,GUI* pParent);
///////////////////////////子GUI管理///////////////////////////
protected:
class GUI* m_pParentGUI; ///父GUI指针,如果为NULL则可能是根对象
vector <GUI*> m_pChildGUIArray; ///子GUI指针队列
public:
void SetParent(GUI* pParent); ///设置父GUI指针
GUI* GetParent(); ///获取父GUI指针
size_t GetChildGUICount(); ///获取子GUI指针总数
bool AppendChildGUI(GUI *pGUI,float startX,float startY); ///增加子GUI指针
//增加GUI在某GUI以前/或以后(根据GUI名)
bool InsertChildGUI(GUI *pGUI,float startX,float startY,char *lpszName,int inserttype = 0);
//增加子GUI在某GUI以前/或以后(根据GUI指针)
bool InsertChildGUI(GUI *pGUI,float startX,float startY,GUI *pTagGUI,int inserttype = 0);
//增加子GUI在某GUI以前/或以后(根据GUI序号)
bool InsertChildGUI(GUI *pGUI,float startX,float startY,int index,int inserttype = 0);
bool DeleteChildGUI(GUI *pChildGUI,bool bRelease=false); ///删除子GUI,通过指针
void DeleteChildGUI(char *lpszName,bool bRelease=false); ///删除子GUI,通过名字
void DeleteAllChildGUI(bool bRelease=false); ///所有子GUI,全部释放
void DeleteSelf(bool bRelease=false); ///要求删除自己
void ReleaseChildGUI(GUI *pChildGUI); ///释放指定对象
void ReleaseAllChildGUI(); ///释放全部对象
GUI* GetChildGUIPtr(char* lpszName); ///根据名字查找这个对象,返回其指针,找不到返回NULL
GUI* GetChildGUIPtr(int id); ///获取某对象
///////////////////////////更新与绘制操作///////////////////////////
public:
virtual void TimeFrame(); ///帧更新,这个由线程控制,每帧30毫秒
virtual void Updata(float dt); ///立即更新
virtual void Render(); ///绘制
protected:
inline void DoChildTimeFrame(); ///帧控制(遍历子对象)
inline void DoChildUpdata(float dt); ///更新(遍历子对象)
inline void DoChildRender(); ///绘制(遍历子对象)
protected:
inline bool PtInGUI(float x,float y); ///检查某个点是否在自己的区域内
///////////////////////////消息处理///////////////////////////
public:
virtual void OnChildMessage(GUI* pChildGUI,UINT iMsg, WPARAM wParam, LPARAM lParam);///子对象发送了命令请求
virtual int OnMessage(UINT iMsg, WPARAM wParam, LPARAM lParam); ///如果要调用某对象的函数,用这个接口进行即可
virtual int OnKeyboardMsg(UINT iMsg, WPARAM wParam, LPARAM lParam); ///键盘消息,用这个接口直接接受键盘消息
virtual int OnCharMsg(UINT iMsg, WPARAM wParam, LPARAM lParam); ///字符消息,用这个接口直接接受键盘消息
int OnMouseMessage(UINT iMsg,WPARAM wParam,LPARAM lParam); ///缺省情况下处理的鼠标消息
int DefMouseMessage(UINT iMsg,WPARAM wParam,LPARAM lParam); ///缺省情况下处理的鼠标消息
void DefMouseMoveOut(); ///缺省鼠标移动出去消息,因为鼠标移出这个动作很特殊,所以使用专门处理
virtual bool TestTransparencePtInGUI(float x,float y); ///检查对象内某点是否透明
virtual int OnMouseMoveIn(float x,float y); ///当鼠标移动进来,用这个函数通知,这一层可以高亮或动画等处理
virtual void OnMouseMoveOut(); ///当鼠标移动出去,通知,可结束高亮或者结束动画等。
virtual void OnMouseStop(); ///当鼠标在这里停下一定时间
virtual int OnMouseWhell(WPARAM wParam,LPARAM lParam); ///当鼠标滚轮消息
virtual int OnMouseLButton(float x,float y,bool down); ///左键按下松开(在区域内)
virtual int OnMouseRButton(float x,float y,bool down); ///右键按下松开(在区域内)
virtual int OnMouseMButton(float x,float y,bool down); ///中键按下松开(在区域内)
virtual void OnMouseLButton(bool down); ///左键按下松开(在区域外)
virtual void OnMouseRButton(bool down); ///右键按下松开(在区域外)
virtual void OnMouseMButton(bool down); ///中键按下松开(在区域外)
virtual int OnMouseLButtonDblclk(float x,float y); ///左键双击
virtual int OnMouseRButtonDblclk(float x,float y); ///右键双击
virtual int OnMouseMButtonDblclk(float x,float y); ///中键双击
};
#endif //CORE_GUIOBJECT_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -