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