1. 项目背景与需求分析
在嵌入式系统开发中,GUI设计往往需要根据硬件特性和项目需求进行深度定制。最近我在一个基于STM32的项目中遇到了这样的需求:使用UCGUI3.90在160×160像素的黑白点阵屏上开发菜单系统,发现默认的EDIT控件带有明显的3D立体效果,这在我们的硬件上显示效果并不理想。
原始3D效果通过多层次的灰度渐变实现(0x808080、0xc0c0c0等),但在我们的单色LCD上,这些中间灰度会被抖动处理,导致边框显示模糊不清。更关键的是,这种拟物化设计风格与我们追求的极简平面化UI风格不符。经过实测,在160×160这种小尺寸屏幕上,复杂的3D边框会占用过多像素空间,反而降低了内容的可读性。
2. UCGUI控件绘制机制解析
2.1 控件绘制流程
UCGUI中所有控件的绘制都遵循统一的架构。当需要重绘EDIT控件时,系统会调用_WIDGET_EFFECT_3D_DrawDownRect函数处理边框绘制。这个函数接收一个GUI_RECT结构体指针,包含了需要绘制的矩形区域坐标。
2.2 原始3D效果实现原理
原始代码通过四层边框绘制实现3D效果:
- 外层左上边:浅灰色(0x808080)实线
- 内层左上边:黑色(0x0)细线
- 外层右下边:白色(0xffffff)实线
- 内层右下边:浅灰色(0xc0c0c0)细线
这种组合模拟了光线从左上角照射的立体效果,是早期GUI设计的典型手法。但在单色屏上,这种精细的灰度渐变无法准确呈现。
2.3 颜色定义与硬件适配
UCGUI中使用RGB565格式定义颜色:
- 0x000000:纯黑
- 0xFFFFFF:纯白
- 0x808080:50%灰度
- 0xC0C0C0:75%灰度
在单色屏驱动中,这些颜色值会被转换为对应的二值化显示效果。这也是为什么我们需要修改为纯黑/白组合 - 可以确保在任何单色LCD上都能获得清晰的显示。
3. 平面化改造具体实现
3.1 修改后的绘制函数
c复制static void _WIDGET_EFFECT_3D_DrawDownRect(const GUI_RECT* pRect) {
GUI_RECT r;
r = *pRect;
LCD_SetC
