zlggui是一个简单的GUI,前后共花了半天时间来试验,有些心得;个人觉得这个UI用在一些需求一个简单的UI嵌入式系统中还是挺好的,移植方便,容易修改。其实现了基本的画线、画长方形、画圆/椭圆、画弧、曲线、填充、5*7\8*8字\24*32ASCII字符、简单窗体、菜单、按键等功能。在试验过程中,修改了一处BUG及增加了几个用来输出GB2312字库的函数。以下详细说明。
源程序中的各功能部分文件逻辑关系结构:
顶层:font_24_32 Font5_7 Font8_8 Menu Spline Windows Loadbit
中层:Gui_basic GUI_StockC ConvertColor
底层:需要由用户根据硬件编写LCD的驱动,并且要符合中层的函数声明要求
配置层:Gui_CONFIG.h,另外需要用户提供一个全局的配置文件(数据类型等)
在移植过程中,只需设计四个文件即可(文件名自定,文件数量也算定,只要功能实现即可):lcd_driver.h lcd_driver.c config.h。其中lcd_driver.c、lcd_driver.h和 config.h需要由用户提供。除了要符合中层Gui_BASIC.H所要求的函数定义外,在lcd_driver.c/h 中还需要定义两个宏(函数):GUI_CmpColor和GUI_CopyColor,注意这两个宏需要根据LCD的显示类型来定义,单色屏和彩色屏不同。
lcd_driver.h中的一些示例:
//这两个宏根据LCD的像素位数不同而不同,以 下是彩色屏定义
#define GUI_CmpColor(color1, color2) ((color1) == (color2))
#define GUI_CopyColor(color1, color2) ((*color1) = (color2))
//单色屏定义
#define GUI_CmpColor(color1, color2) ( (color1&0x01) == (color2&0x01) )
#define GUI_CopyColor(color1, color2) ((*color1) =( color2&0x01))
//定义一些颜色值
#define red 0x001f
#define blue 0xf800
#define green 0x07e0
#define black 0x0000
=====================================
lcd_driver.c中的一些示例:
在这个驱动文件中,需要定义几个函数:画点、取点、画水平线、画垂直线、画任意两点线四个函数,且要和Gui_basic.h中的函数声明符合。在我的移植中,我在lcd_driver.h中用宏来联系这些函数,这样就不用改变我lcd_driver.c中的函数名,如下:
#define GUI_Point set_pixel
#define GUI_HLine draw_hline
#define GUI_RLine draw_vline
#define GUI_ReadPoint get_pixel
config.h中的一些示例:
typedef unsigned char uint8; /* 无符号8位整型变量 */
typedef signed char int8; /* 有符号8位整型变量 */
typedef unsigned short uint16; /* 无符号16位整型变量 */
typedef signed short int16; /* 有符号16位整型变量 */
typedef unsigned int uint32; /* 无符号32位整型变量 */
typedef signed int int32; /* 有符号32位整型变量 */
typedef unsigned short TCOLOR;
//包含文件,根据工程的环境来包含
#include "GUI_BASIC.H"
#include "font5_7.h"
#include "font24_32.h"
#include "font8_8.h"
#include "font_macro.h"
#include "windows.h"
在移植过程中,发现zlggui的一个BUG。在font_24_32.c中,GUI_PutChar24_32函数设计有误,导致不能正确输出字体数据。按照我的理解逻辑,修改后如下:
uint8 GUI_PutChar24_32(uint32 x, uint32 y, uint8 ch)
{ uint8 font_dat;
uint8 i, j, k;
TCOLOR bakc;
/* 参数过滤 */
if( x>(GUI_LCM_XMAX-32) ) return(0);
if( y>(GUI_LCM_YMAX-32) ) return(0);
for(i=0; i<14; i++)
{ if(FONT24x32_TAB[i]==ch) break;
}
ch =