📄 wnd.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 + -