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

📄 wnd.h

📁 基于ARM平台的控制系统,自己带有MINIGUI,可以直接在VC下运行界面演示程序
💻 H
字号:
#ifndef __GUIPP_CWND_H__
#define __GUIPP_CWND_H__

#include "CompileSwitch.h"
#include "GUIpp.h"
#if _USE_GUI == 1

/////////////////////////////////////////////////////////////////


#define MSGCODE_KEY_DOWN	1
#define MSGCODE_KEY_UP		2


#define DESKTOP_BORDER			COLOR_BORDER
#define DESKTOP_BKGROUND		COLOR_BKGROUND



/////////////////////////////////////////////////////////////////


#define LAST_NODE			0x7fffffff
#define INVALID_DISTANCE	-1
class CLinkListNode
{
private:
	CLinkListNode * pPrevNode;
	CLinkListNode * pNextNode;
public:
    // Note: nBuffSize is byte size!!!
    virtual char * GetNodeDataFieldString(int nFieldIndex,char * pBuffer,int nBuffSize);
	CLinkListNode();
	~CLinkListNode();
	int IsFinalNode();
	int GetStepsTo(CLinkListNode * pNode);
	CLinkListNode * GetNextNode(int nStep);
	CLinkListNode * GetPrevNode(int nStep);
	void InsertAfter(CLinkListNode *pNewNode);
	void InsertBefore(CLinkListNode *pNewNode);
	void RemoveMe(void);
};

class CLinkList
{
private:
    CLinkListNode * w_pRoot;
    int             w_nNodeNumber;
    CLinkListNode* GetLastNode(void);
public:
    CLinkList(void);
    void Append(CLinkListNode * pListNode);
    CLinkListNode * GetLinkListNode(int nIndex);
    // remove the node from container,but the node not be freed!
    CLinkListNode * RemovelLinkListNode(int nIndex);
    int GetNodeNumber(void);
};

class NANARect
{
public:

	int w_nX1;
	int w_nX2;
	int w_nY1;
	int w_nY2;
	
	int GetWidth(void);
	int GetHeight(void);
	void MoveTo(int nX,int nY);
	void MoveBy(int nX,int nY);
	int IsPointInside(int x,int y);
};


#define UGWS_VISIBLE		0x01
#define UGWS_BORDER			0x02
#define UGWS_THICKBORDER	0x04
#define UGWS_ROUNDBORDER	0x08
#define UGWS_ACCEPTMSG		0x10
#define UGWS_TIMERON		0x20
///////////////////////////////////////////////////////
//Raw message (start with UGRW)
//

#define UGRW_MOUSE_DOWN		1
#define UGRW_MOUSE_UP		2
#define UGRW_MOUSE_MOVE		3
//////////////////////////////////////////////////////
// Notify code (start with UGNC)
//
#define UGNC_CLICK			1
#define UGNC_MSGBOX			2

class NANATimer;
class NANAWnd;
class NANAFrameWnd;
class NANADeskTopWnd;
class NANALayouter;

class NANAWnd
{
protected:
	/*
		index pointer for linking all window together to 
		form a tree-map.
	*/
	NANAWnd* 	w_pParentWnd;			//parent window index
	NANAWnd* 	w_pFirstChildWnd;		//first child window 
	NANAWnd*	w_pNextSiblingWnd;		//sibling window: belong to same parent window

	NANAWnd*	w_PrevCaptureWnd;		//window who capture mouse prior to us

	int 	w_nStyleFlag;			//style flag to control the apperences
	
	int		w_bDirty;				//当前LCD屏幕上的内容为陈旧内容,需要更新
protected:

	NANARect 	w_Rect;					//rectangle area for drawing	

	NANAWnd * GetTopMostChild(void);
	void AppendNewChild(NANAWnd *pNewChildWnd);
	void InsertNewChild(NANAWnd *pNewChildWnd);
	void RemoveChild(NANAWnd *pRemoveChild);
public:

	NANAWnd();	
	virtual ~NANAWnd();	

	virtual int	CreateWnd(
				NANAWnd *pParentWindow,
				int nX1,
				int nY1,
				int nWidth,
				int nHeight,
				int nStyleFlag = UGWS_VISIBLE);
	void CloseWindow();
	void NotifyWindow(NANAWnd *pDstWnd,int nMessageCode,int nParam1,int nParam2);
	void SetWindowVisible(int bVisible);
	int  IsWindowVisible(void);
	void MoveWindowForeground(void);
	void MoveWindowBackground(void);
	void GetWindowRect(NANARect *pRect);
	void MoveTo(int nX,int nY);
	void Move(int xOffset,int yOffset);
	NANAWnd *	GetParentWnd(void);
	void DestroyWindow(void);
	void PaintWindow(void);
	NANAWnd* PointTest(int x,int y,int bTestSibling);
	void CaptureMouse(void);
	void ReleaseMouse(void);
	NANAWnd * GetPreviousSibling(void);

	void 	Invalidate()
	{
		SetUIDirty(1);
	}
	void 	SetUIDirty(int bDirty);
	int 	IsUIDirty()
	{
		return w_bDirty;
	}
public:
	virtual void OnCreate()
	{
	}
	virtual void OnClose()
	{
	}
	virtual void OnPaint()
	{
	}
	virtual void OnTimer(NANATimer *pTimer)
	{
	}
	virtual void OnMouseDown(int x,int y)
	{
	}
	virtual void OnMouseUp(int x,int y)
	{
	}
	virtual void OnMouseMove(int x,int y)
	{
	}
	virtual void OnNotify(NANAWnd *pSrcWnd,int nMessageCode,int nParam1,int nParam2)
	{
	}
};

class NANATimer
{
private:
	NANAWnd * w_pWnd;
 public:
 	NANATimer * w_pNextTimer;
	int		w_nTimerPeriod;
	int		w_nTimerCount;
	
	NANATimer(NANAWnd * pCurWnd );

	void TimeOut(void);

	int IsTimerAcitve(void);
	void Start(int nCnt,int nPeriod = 0);
	void Stop(void);
	void CountDown(void);
 };


class NANAUGMessage:public CLinkListNode
{
public:
	NANAWnd *		w_pDstWnd;
	NANAWnd *			w_pSrcWnd;
	int 				w_nMessageCode;
	int 				w_nParam1;
	int 				w_nParam2;
};

void NANAGUI_Init(void);

class NANADeskTopWnd : public NANAWnd
{
private:
	NANAUGMessage		w_MsgQueueHead;
	NANAUGMessage		w_MsgQueueTail;
	NANATimer 			w_DeskTopTimer;

	NANAWnd * w_pFocusWnd;
	NANAWnd * w_pCaptureMouseWnd;
	
	//static NANADeskTopWnd s_DeskTopWnd;
	
	int		w_bNeedRefreshAll;

public:
	NANADeskTopWnd(void);
	~NANADeskTopWnd();
public:
	static NANADeskTopWnd * Instance(void);
	
	NANAWnd * GetFocusWnd(void);
	void SetNeedForRefreshAll(int bNeedRefreshAll);
	NANAWnd	* SetMouseCaptureWindow(NANAWnd *pWnd);
	void UpdateFocus(void);
	void UpdateUI(void);
	void DispatchKeyMessage(int nMessageCode,int nParam1,int nParam2);
	void DispatchMouseMessage(int nMouseMessage,int x,int y);
	void DispatchTimeCntDown(void);
 	void NotifyWindow(NANAWnd * pDstWnd,NANAWnd * pSrcWnd,int nMessageCode,int nParam1,int nParam2);
	void EmptyMessageQueue(void);
	void AddTimer (NANATimer * pTimer);
	void RemoveTimer(NANATimer * pTimer);
	
	//desktop window have it's background color
	void OnPaint(void);
};

//
//	Layouter's only ability is to make decision about where 
//	each item should be placed.
//
#define LAYOUTER_MAX_CNT	10
class NANALayouterTarget
{
public:
	NANALayouterTarget()
	{
		w_nLayouterCount = 0;
	}
	
	//
	// Layouter can cause re-layout by itself,LayouterTarget
	// need to be aware of that
	//
	virtual void Redraw()=0;
	
	//
	// draw or position the sepecified item
	//
	virtual void LayoutItem(NANALayouter * pLayouter,int nItemIndex,NANARect rc,int bVisible,int bSelected)
	{
	}
	//
	// return the size of the specified item
	//
	virtual void MeasureItem(NANALayouter * pLayouter,int nItemIndex,int &nWidth,int &nHeight,int bSelected)
	{
	}
	
	void DoLayout();
	void AddLayouter(NANALayouter * pLayouter);
	
private:
	NANALayouter * 	w_pLayouterArray[LAYOUTER_MAX_CNT];
	int			w_nLayouterCount;
};

class NANALayouter
{
public:
	NANALayouter(NANALayouterTarget *	 pLayoutTarget)
	{
		w_pLayoutTarget = pLayoutTarget;
		w_pLayoutTarget->AddLayouter(this);
	}
	NANALayouterTarget *	 	w_pLayoutTarget;
public:
	//重载该方法实现不同的Layout
	virtual void DoLayout()=0;
	
protected:
	void MeasureTargetItem(int nItemIndex,int &nWidth,int &nHeight,int bSelected)
	{
		DEBUG_Assert(w_pLayoutTarget != NULL);
		w_pLayoutTarget->MeasureItem(this,nItemIndex,nWidth,nHeight,bSelected);
	}
	void LayoutTargetItem(int nItemIndex,NANARect rc,int bVisible,int bSelected)
	{
		DEBUG_Assert(w_pLayoutTarget != NULL);
		w_pLayoutTarget->LayoutItem(this,nItemIndex,rc,bVisible,bSelected);
	}
	void InvalidateTarget()
	{
		DEBUG_Assert(w_pLayoutTarget != NULL);
		w_pLayoutTarget->Redraw();
	}
};

class NANAFrameWnd : public NANAWnd,public NANALayouterTarget
{
public:
	void OnPaint()
	{
		OnDraw();
		
		//first do the layout and may be drawing 
		DoLayout();

	}
	void Redraw()
	{
		Invalidate();
	}
	
	
	virtual void OnKey(int nKeyCode,int bKeyDown)
	{
	}

	virtual void OnDefault()
	{
	}

	// FrameWnd derived class should override OnDraw() to 
	// draw itself.before this function get called,all items position
	// has been decided by Layouter if there are any Layouter.
	virtual void OnDraw()
	{
		
	}
};


#endif
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -