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.
CContainerWidget* m_pRootContainer;
CDisplayManage* m_pDisplayManage;
2. Define a listener used to listen the animate event.
ModelListener m_animateListener;
static void HandleAnimateListener(void *pUserData, ModelEvent *pEvent);
3. Init the root container and displaymanger
int CwidgetExampleDlg::IniteGui(void)
{
StartAnimateEngine(30);
m_animateListener.pfnListener = HandleAnimateListener;
m_animateListener.pListenerData=this;
m_animateListener.bEnableEventHandle=true;
CRect wrc;
GetWindowRect(&wrc);
this->m_pDisplayManage=new CDisplayManage(this->m_hWnd,wrc.Width(),wrc.Height());
this->m_pRootContainer=new CContainerWidget();
m_pDisplayManage->RegisterRootContainer(m_pRootContainer);
m_pRootContainer->SetDisplayManage(this->m_pDisplayManage);
WRect rootRc;
CRECT_TO_WRECT(wrc,rootRc);
rootRc.x=0;
rootRc.y=0;
m_pRootContainer->SetRect(&rootRc,false);
CBackGroundWidget* pBkW=new CBackGroundWidget();
WRect rc;
m_pRootContainer->GetRect(&rc);
rc.x=0;
rc.y=0;
m_pRootContainer->InsertWidget(pBkW,Z_ORDER_BACKGROUND);
pBkW->SetRect(&rc);
pBkW->SetBackgroundColor(0x0);
m_pRootContainer->InvalidateContent(0);
return 0;
}
4. Hook the windows mouse, key, paint event to egui
BOOL CwidgetExampleDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN )
{
WKEY_EVENT_T key_evt;
key_evt.key_code=pMsg->wParam;;
key_evt.rpt_cnt=LOWORD(pMsg->lParam);
key_evt.flag=HIWORD(pMsg->wParam);
m_pRootContainer->HandleEvent(KEY_EVENT_DOWN,(int)(&key_evt),0);
}
if( pMsg->message ==WM_KEYUP)
{
WKEY_EVENT_T key_evt;
key_evt.key_code=pMsg->wParam;;
key_evt.rpt_cnt=LOWORD(pMsg->lParam);
key_evt.flag=HIWORD(pMsg->wParam);
m_pRootContainer->HandleEvent(KEY_EVENT_UP,(int)(&key_evt),0);
}
if(pMsg->message==WM_LBUTTONUP)
{
WPoint ptScreen;
CPoint pt;
pt.x=pMsg->pt.x;
pt.y=pMsg->pt.y;
this->ScreenToClient(&pt);
ptScreen.x=pt.x;
ptScreen.y=pt.y;
m_pRootContainer->HandleEvent(MOUSE_LBUTTON_UP,(int)(&ptScreen),pMsg->lParam);
}
...
return CDialog::PreTranslateMessage(pMsg);
}
5. hook the paint event
void CwidgetExampleDlg::OnPaint()
{
m_pRootContainer->InvalidateContent(0);
}
History
Initial version by XIAOWANG YANG
Reference
1. Daniel godson for his CEnBitmap implementation.
2.