Introduction
eGUI is a windows GDI based UI developer kit, which implement a Widget based on UI framework and much usefully function of bitmap opeartion like transparent, rotate , moving, zooming, also it include a effeciently dirty area management machnism to help the devloper easily develop advanced application.
Background
The eGUI is from the idea of I want to develop a Chinese GO game, but I found it is hard to use the windows GDI to develop such application maybe involved much Bitmap operation, so I decide to develop a new GUI libary for this purpose.
Using the code
eGUI include below basic classes:
CWidget: which is base class of each UI widget.
CContainerWidget: which is the container will be used to hold and display all kinds of widget.
CDisplayManager: which keep the windows draw context, and will be used to draw on the screen,and also implement the dirty area management.
CFrameSurface: which is used to implement many kinds of draw opeation like, text drawing, bitmap drawing, transparent drawing,also it will be used as surface during the animating.
CAnimateEngine: which implement a engine to trigger the surface drawing.
CAnimateThread: each widget animation will be handled by a Thread.
CAnimateController: each animation will mapped to a animate controller for the actually animation calculation.
1. define the root container and display manage.
<br>
CContainerWidget* m_pRootContainer; <br>
CDisplayManage* m_pDisplayManage;<br>
2. Define a listener used to listen the animate event.
<br>
ModelListener m_animateListener;<br>
static void HandleAnimateListener(void *pUserData, ModelEvent *pEvent);<br>
3. Init the root container and displaymanger
int CwidgetExampleDlg::IniteGui(void)<br>
{<br>
StartAnimateEngine(30);<br>
m_animateListener.pfnListener = HandleAnimateListener;<br>
m_animateListener.pListenerData=this;<br>
m_animateListener.bEnableEventHandle=true;<br>
CRect wrc;<br>
GetWindowRect(&wrc);<br>
this->m_pDisplayManage=new CDisplayManage(this->m_hWnd,wrc.Width(),wrc.Height());<br>
this->m_pRootContainer=new CContainerWidget();<br>
m_pDisplayManage->RegisterRootContainer(m_pRootContainer);<br>
m_pRootContainer->SetDisplayManage(this->m_pDisplayManage);<br>
WRect rootRc;<br>
CRECT_TO_WRECT(wrc,rootRc);<br>
rootRc.x=0;<br>
rootRc.y=0;<br>
m_pRootContainer->SetRect(&rootRc,false);<br>
CBackGroundWidget* pBkW=new CBackGroundWidget();<br>
WRect rc;<br>
m_pRootContainer->GetRect(&rc);<br>
rc.x=0;<br>
rc.y=0;<br>
m_pRootContainer->InsertWidget(pBkW,Z_ORDER_BACKGROUND);<br>
pBkW->SetRect(&rc);<br>
pBkW->SetBackgroundColor(0x0);<br>
m_pRootContainer->InvalidateContent(0);<br>
return 0;<br>
}<br>
4. Hook the windows mouse, key, paint event to egui
BOOL CwidgetExampleDlg::PreTranslateMessage(MSG* pMsg)<br>
{<br>
if(pMsg->message == WM_KEYDOWN )<br>
{
WKEY_EVENT_T key_evt;<br>
key_evt.key_code=pMsg->wParam;;<br>
key_evt.rpt_cnt=LOWORD(pMsg->lParam);<br>
key_evt.flag=HIWORD(pMsg->wParam); <br>
m_pRootContainer->HandleEvent(KEY_EVENT_DOWN,(int)(&key_evt),0); <br>
}<br>
if( pMsg->message ==WM_KEYUP)<br>
{<br>
WKEY_EVENT_T key_evt;<br>
key_evt.key_code=pMsg->wParam;;<br>
key_evt.rpt_cnt=LOWORD(pMsg->lParam);<br>
key_evt.flag=HIWORD(pMsg->wParam);<br>
m_pRootContainer->HandleEvent(KEY_EVENT_UP,(int)(&key_evt),0); <br>
}<br>
if(pMsg->message==WM_LBUTTONUP)<br>
{<br>
WPoint ptScreen;<br>
CPoint pt;<br>
pt.x=pMsg->pt.x;<br>
pt.y=pMsg->pt.y;<br>
this->ScreenToClient(&pt);<br>
ptScreen.x=pt.x;<br>
ptScreen.y=pt.y;<br>
m_pRootContainer->HandleEvent(MOUSE_LBUTTON_UP,(int)(&ptScreen),pMsg->lParam); <br>
}<br>
...<br>
return CDialog::PreTranslateMessage(pMsg);<br>
}<br>
5. hook the paint event
void CwidgetExampleDlg::OnPaint() <br>
{<br>
m_pRootContainer->InvalidateContent(0);<br>
}<br>
History
Initial version by XIAOWANG YANG
Reference
1. Daniel godson for his CEnBitmap implementation.
2.