体外诊断(POCT)之无窗口界面库:VGUI

无窗口句柄的界面库,商业化应用的很多,腾讯、阿里都要自己的界面库,虽然它们都有共同的根源

然而,市场上收费或免费的界面库大多使用渲染+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;
		}

每个控件都要十几到几十个接口,详情参阅技术文档。


部分界面截图:





系统是针对中低配置的机器,面向触摸屏开发的。圆形按钮就是针对触摸屏设计的,

就像枪械的觇孔式照门要比缺口式照门精准很多倍一样,类似的还有红点瞄准镜等等,

定位一个圆的中心比定位其它形状的中心容易得多的多,而且人的手点触不会太精确,

因而按钮不能太小,考虑边界可能有阻碍,也不能太靠边。

界面是伪灰色错觉,其实是亮银色,以匹配大多数金属塑料外壳的科技色调。

另外还有触屏手写,将做另文说明。



版权声明:本文为prsniper原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。