eGUI,一个动画 UI 开发工具包
一个易于使用的控件库,用于基于 Windows GDI 开发动画 GUI
引言
eGUI 是一个基于 Windows GDI 的 UI 开发工具包,它实现了一个基于 UI 框架的小部件,并提供了许多有用的位图操作功能,如透明、旋转、移动、缩放等。此外,它还包含一个高效的脏区域管理机制,以帮助开发者轻松开发高级应用程序。
背景
eGUI 源于我想开发一个中国象棋游戏的想法,但我发现使用 Windows GDI 开发这样的应用程序可能涉及大量的位图操作,因此我决定为此开发一个新的 GUI 库。
使用代码
eGUI 包含以下基本类:CWidget:每个 UI 小部件的基类。CContainerWidget:将用于容纳和显示各种小部件的容器。CDisplayManager:负责维护窗口的绘图上下文,并将用于在屏幕上绘图,同时实现脏区域管理。CFrameSurface:用于实现文本绘制、位图绘制、透明绘制等多种绘图操作,并且在动画期间用作表面。CAnimateEngine:实现一个引擎来触发表面绘制。CAnimateThread:每个小部件动画将由一个线程处理。CAnimateController:每个动画将映射到一个动画控制器,用于实际的动画计算。
1. 定义根容器和显示管理器。
//将用作根容器
CContainerWidget* m_pRootContainer;
//将用作 CDisplayManager
CDisplayManage* m_pDisplayManage;
2. 定义一个监听器,用于监听动画事件。
//事件监听器
ModelListener m_animateListener;
//事件监听器句柄
static void HandleAnimateListener(void *pUserData, ModelEvent *pEvent);
3. 初始化根容器和显示管理器
int CwidgetExampleDlg::IniteGui(void)
4. 挂钩 Windows 鼠标、键盘、绘制事件到 egui
{
//启动动画引擎
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;
}
BOOL CwidgetExampleDlg::PreTranslateMessage(MSG* pMsg)
5. 挂钩绘制事件
{
if(pMsg->message == WM_KEYDOWN )
{ //(wParam), LOWORD(lParam), HIWORD(lParam)
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);
}
void CwidgetExampleDlg::OnPaint()
{
m_pRootContainer->InvalidateContent(0);
}
历史
初始版本由杨晓旺编写
参考
1. Daniel godson 提供的 CEnBitmap 实现。2。