无窗口句柄的界面库,商业化应用的很多,腾讯、阿里都要自己的界面库,虽然它们都有共同的根源
然而,市场上收费或免费的界面库大多使用渲染+XML+js的方式来实现布局描述,虽然很好的实现逻辑分离
但是不能很好的发挥性能,因此开发了这个以性能和效果兼优的界面库:VGUI
功能特点:
1.纯C/C++编写的控件,不依赖外部描述,执行快,体积小
2.面向对象的维护方式,轻松派生有更多功能的控件,而且有基础类自动释放的机制,避免内存泄漏
3.五向链表的渲染和键鼠响应机智,不会把时间浪费在寻找控件上,每个事件直接到位,每个控件可以透明叠加
4.基于GDI+的渲染引擎,没有显卡依赖,大量的图片格式和文本抗锯齿效果支持,并能自定义任意形状的光标响应区
5.事件回调函数指针的方式,同一个类的不同对象可以用不同的事件处理例程
6.汇编级的窗口过程转换,每个窗口对象直接定位到CForm指针,无需任何循环搜索,没有Hook,高效稳定
7.基于“界面”的布局,窗口可以有很多界面,只有一个界面响应事件,一个或两个界面被渲染
8.自动的状态渲染,如按钮控件只加载一张图片,光标经过自动加亮5%,按下变暗5%等等,降低内存开支
备注:
界面库每个控件都要静态的创建接口,可以实现跨模块的内存分配和释放
容器控件在释放时会自动释放子控件,一个控件有焦点时,鼠标事件对其它所有控件是透明的,
即只有它响应鼠标移动按下和弹起,直到鼠标移动到其它控件,大幅的降低处理器压力
在实际测试中,频繁的移动鼠标使控件重绘进入和离开效果,8张800*600的背景图片,近50张160*160的按钮图片,
只消耗了3%的CPU和5M内存(图片为PNG格式)
以控件基类的静态分配接口为例:
int CControl::Create(CControl **ppCtrl)
{
CControl *pCtrl;
if(ppCtrl == NULL)
{
return VGUI_ERROR_INVALID_PARAMETER; // 无效指针
}
pCtrl = NULL;
局部对象析构:: 无法在要求对象展开的函数中使用 __try >> C/C++ >> 代码生成 >> 启用C++异常 >> 否
//__try
//{
// pCtrl = new CControl();
//}
//__except(EXCEPTION_EXECUTE_HANDLER)
//{
// return VGUI_ERROR_CACHE_ALLOCATION; // 内存分配失败
//}
try
{
pCtrl = new CControl();
if(pCtrl == NULL)
{
throw VGUI_ERROR_CACHE_ALLOCATION; // 兼容指针判断和防止优化
}
*ppCtrl = pCtrl;
}
catch(...) // int &i
{
if(pCtrl != NULL)
{
delete pCtrl; // 申请成功, 但赋值失败(指针地址不可写)
pCtrl = NULL;
}
return VGUI_ERROR_CACHE_ALLOCATION; // i
}
return VGUI_ERROR_SUCCESS;
}每个控件都要十几到几十个接口,详情参阅技术文档。
部分界面截图:
系统是针对中低配置的机器,面向触摸屏开发的。圆形按钮就是针对触摸屏设计的,
就像枪械的觇孔式照门要比缺口式照门精准很多倍一样,类似的还有红点瞄准镜等等,
定位一个圆的中心比定位其它形状的中心容易得多的多,而且人的手点触不会太精确,
因而按钮不能太小,考虑边界可能有阻碍,也不能太靠边。
界面是伪灰色错觉,其实是亮银色,以匹配大多数金属塑料外壳的科技色调。
另外还有触屏手写,将做另文说明。