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

📄 gui.h

📁 HGE 2D游戏引擎制作的一个演示
💻 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 + -