当前位置:网站首页>UCGUI简介
UCGUI简介
2020-11-07 23:08:00 【shzwork】
uC/GUI是Micrium公司研发的通用的嵌入式用户图像界面软件。他给任何使用图像LCD的应用程式提供单独于处理器和LCD控制器之外的有效的图
形用户接口。能够应用于单一任务环境,也能够应用于多任务环境中。uC/GUI能够应用于任何LCD控制器和CPU的任何尺寸的物理显示或模拟显示中。
uC/GUI的特点如下:
- 适用于任何8位/16位/32位CPU,可允许于支持ANSI C的任何编译器
- 适用于任何控制器驱动任何LCD(单色,灰度,或彩色)
- 通过配置宏,可支持任何接口
- 可配置显示尺寸
- 可在LCD的任何一点上显示字符和画位图
- 对于显示尺寸和速度提供优化进程,编译时间依赖于采用的优化进程
- 支持虚拟显示,虚拟显示的尺寸比实际显示大。
4.2 uC/GUI文档组织
uC/GUI目录下的文档有配置文档目录Config,GUI库函数目录,连同为GUI编写的应用程式目录。下面分别简要介绍相应目录下的函数,更为周详的文档介绍请参考我的uC/GUI移植的源代码。
- uC/GUI\Config\目录:
GUICONF.h: 配置GUI移植到不同操作系统的选项。在本论文中配置移植到uC/OSII中,允许多任务调用uC/GUI函数。
GUITouchConf.h:配置触摸屏的选项连同编写触摸屏的驱动。本文移植uC/GUI所使用的LCD屏不支持触摸屏,所以此文档为空。
LCD_Init.C: LCD控制器的初始化文档。
LCD_Conf.h: LCD显示屏的选项文档,包括bpp,调试板模式,水平、竖直方向的分辨率等等。 - uC/GUI\GUI\AntiAlias\目录:
这个目录中包含9个文档,处理显示的边缘模糊效果,也就是抗锯齿和优化LCD锯齿。液晶屏上画斜线往往都有锯齿,所以通过优化算法进行美化。 - uC/GUI\GUI\ConvertColor\目录:
这个目录中包含14个.C文档,涉及调色板模式。uC\GUI的调色板模式支持111模式,222模式,223,323,332,444,555,
565,8666等相关模式。我在论文中使用的LCD屏,为单色16级灰度屏,因而不涉及到这些模式。但为了保持UC\GUI文档的完整性,该目录连同目
录下14个文档,仍然保存在移植文档中。 - uC/GUI\GUI\ConvertMono\目录:
此目录下的文档描述单色显示的不同模式,包含4个文档。 - uC/GUI\GUI\Core
此目录下包含129个文档,是uC/GUI的核心部分。包括GUI头文档,GUI显示各种文本,二进制,十进制,十六进制,字符型文本,字符串,在不同的
位置显示二进制,十进制,十六进制,字符型文本,字符串等;GUI配置各种字体;GUI的2-D图像库,GUI绘图函数,在各种位置绘各种点,线,位图,
多边形,长方形,圆等等;GUI获取函数,获取当前点,线,位图,多边形,长方形,圆,当前字体,当前二进制,十进制,十六进制,字符型文本,字符串等函
数;配置GUI画笔函数;GUI支持的鼠标函数;GUI支持的键盘函数,GUI支持的触摸屏函数;GUI配置LCD函数等等。这些函数,在uC/GUI系
统中都是必须的函数。正是这些函数的组合,使得uC/GUI具备复杂而且完备的图像用户接口。而且,这些函数的组合,使得uC/GUI能够单独的使用,也
能够通过配置文档,移植到各种操作系统中使用。 - uC/GUI\GUI\Font
此目录下包含的是uC/GUI支持的字体。 - uC/GUI\GUI\LCDDriver
LCD API目录。该目录下包含很多已完备的LCD控制器的驱动程式连同API函数。 - uC/GUI\GUI\MemDev
MemDev目录。
MemDev主要用于防止在画交迭图时产生的抖动。
uC/GUI函数绘图不使用MemDev时,画图操作直接写到终端上显示,交迭绘图执行时刷新屏幕,多次刷新时就会出现抖动。例如,要在背景色中画图,且
在前景中写一些透明的文字,实现的步骤就是先画图,然后写文字,那么结果就会出现文字的抖动。假如在程式中使用MemDev,则任何的执行操作都在
MemDev中执行,当任何的操作都执行完毕之后,最后的结果才会送到屏幕上显示,因而能够避免多次刷新,从而避免抖动。
此目录下包含这MemDev的任何函数,包括创建MemDev函数,激活MemDev,执行画图操作,显示到终端,删除MemDev函数等等。 - uC/GUI\GUI\Touch
触摸屏驱动函数所在目录。uC/GUI只支持模拟的触摸屏。因而此目录下只包含模拟触摸屏。 - uC/GUI\GUI\Widget
此目录包含窗口控件函数,总共46个函数。UC/GUI中窗口控件机制时uC/GUI的实现难点,也是应用难点。运用窗口管理和回调机制,运用窗口控件函
数,能够任意在LCD屏幕上实现类似于windows的界面,这样完备的功能在工业自动化控制和触摸屏应用上有着深远而积极的意义。此目录下的函数主要包括uC/GUI的窗口控件,如按钮BUTTON,校验窗CHECKBOX,编辑区EDIT,窗口框FRAMEWIN,列表
LISTBOX,进度条PROGBAR,音频按钮RADIOBUTTON,滚动条SCROLLERBAR,改变值的灰度条SLIDER,连同文本框
TEXT相关的各种函数。 - uC/GUI\GUI\WM
此目录包括窗口管理函数,总共52个函数。UC/GUI中,窗口管理中的消息传递机制和回调机制,也是uC/GUI的实现难点和应用难点。4.3节中将周详介绍这两点。
此目录下的函数主要包括配置、返回、建立背景窗口、父窗口、各种子窗口连同相应的尺寸、窗口句柄,起点x,y坐标,窗口宽度,高度,位置等等,还包括改变窗口的大小,连同最关键的窗口的回调函数,窗口重绘函数等等。
4.3 uC/GUI的窗口管理
4.3.1简介
uC/GUI的窗口管理是个单独的软件,不是uC/GUI的基本组成部分。周详代码见\uCGUI\GUI\WM。
当使用uC/GUI窗口管理时,任何能显示在显示终端上的内容都包含在一个窗口里面,这个窗口是LCD屏幕上的一个给用户画图或显示目标的区域。窗口能够是任何尺寸的,能够一次在屏幕上显示多个窗口,也能够在其他窗口当中或之前显示窗口。
窗口管理的几个名词:
- 活动窗口:
当前正在用来画图或是显示操作的窗口。 - 回调函数
回调函数是由用户定义的,当特定事件发生时,指示图像系统调用特定函数的函数。通常当窗口的内容发生改变时,他们用
来自动重绘窗口。例如,窗口内显示一幅位图,当窗口移动时,位图并不会自动移动,此时,就需要调用回调函数对窗口进行重绘,即,从观众的角度来看,移动窗
口和窗口内容。 - 子/父窗口
子窗口是相对于父窗口定义的窗口。无论何时,只要父窗口移动,则子窗口们都要相应移动。子窗口被父窗口完全包含。拥有同一个父窗口的子窗口们互相间称为兄弟。 - 客户区
窗口的客户区就是窗口的可用区。假如窗口包含方框或标题栏,则客户区就是方框或标题栏的内部区域。 - 句柄
当一个新的窗口被创建时,WM分配一个唯一的标识符,称为句柄。句柄用在后续对该窗口操作的任何函数中,而且能够利用该句柄唯一标识该窗口。 - 有效窗口/无效窗口
有效窗口是个已完全更新,无需重绘的窗口。不管是完全重绘还是局部重绘。当窗口内容发生改变时,WM则标识窗口无效。下一次重绘之后(调用回调函数),窗口又变为有效。
4.3.2回调机制
uC/GUI提供给窗口和窗口控件的回调机制的背后,是一
个事件驱动标志。在大多数的窗口系统中,流控不但仅时从用户程式到图像系统,而且还要能够从用户程式到图像系统,并且能够通过用户程式提供的回调函数,返
回到用户程式。这个机制,就称为回调机制。在uC/GUI中,回到机制用来在窗口管理中出控制窗口的重绘操作,这使得窗口管理的有效性成为可能。
4.3.3 回调函数的使用
使用回调函数建立一个窗口时,必须有一个回调函数。所用的回调函数必须有如下原型:
void callback (WM_MESSAGE *pMsg)。 其中pMsg为指向消息的指针。
回调函数执行的功能依赖于所接收到的消息。以上原型后一般跟着switch表达式,表达式定义不同的case表达式下不同的信息对应的不同行为,至少要有一个重绘函数:WM_PAINT()。如程式清单4.1,建立一个自动更新窗口的回调函数
程式清单 4.1 建立一个自动更新窗口的回调函数
void WinHandler (WM_MESSAGE * pMsg)
{
switch (pMsg->MsgId)
{
case: WM_PAINT GUI_SetBkColor(0xff00);
GUI_Clear();
GUI_DispStringAt(“hello world”,0,0);
Break;
}
}
使用回调函数,更为周详的示例如程式清单4.2所示:
程式清单4.2 回调函数
#include "GUI.H"
/* 背景窗的回调函数 */
static void cbBackgroundWin(WM_MESSAGE* pMsg)
{
switch (pMsg->MsgId)
{
case WM_PAINT: GUI_Clear();
default: WM_DefaultProc(pMsg);
}
}
/* 前景窗的回调函数 */
static void cbForegroundWin(WM_MESSAGE* pMsg)
{
switch (pMsg->MsgId)
{
case WM_PAINT: GUI_SetBkColor(GUI_GREEN);
GUI_Clear();
GUI_DispString("Foreground window");
default: WM_DefaultProc(pMsg);
}
}
/* 回调机制 */
static void DemoRedraw(void)
{
GUI_HWIN hWnd;
while(1)
{
/*创建一个前景窗 */
hWnd = WM_CreateWindow(10, 10, 100, 100, WM_CF_SHOW, cbForegroundWin, 0);
/*显示前景窗*/
GUI_Delay(1000);
/* 删除前景窗 */
WM_DeleteWindow(hWnd);
GUI_DispStringAt("Background of window has not been redrawn", 10, 10);
/* 等待,显示并不重绘 */
GUI_Delay(1000);
GUI_Clear();
/* 配置背景窗的回调功能 */
WM_SetCallback(WM_HBKWIN, cbBackgroundWin);
/*创建一个前景窗 */
hWnd = WM_CreateWindow(10, 10, 100, 100,WM_CF_SHOW, cbForegroundWin, 0);
/* 显示前景窗*/
GUI_Delay(1000);
/*删除前景窗 */
WM_DeleteWindow(hWnd);
/* 等待,显示将重绘*/
GUI_Delay(1000);
/* 删除回调函数 */
WM_SetCallback(WM_HBKWIN, 0);
}
}
void main(void)
{
GUI_Init();
DemoRedraw();
}
4.3.4 消息传递机制
程式清单4.2中,回调函数执行的功能依赖于所接收到的消息。Switch语句中根据消息的类型,分别执行不同的功能。
WM_MESSAGE的成员如下:
MsgId:消息类型
HWin: 目的窗口
HWinSrc: 源窗口
Data.p : 数据指针
Data.v: 数据值
其中MsgId的类型如下:
WM_PAINT: 窗口重绘
WM_CREATE: 窗口一建立就发送
WM_DELETE: 窗口一删除就发送
WM_SIZE : 窗口尺寸发生改变就发送
WM_MOVE : 窗口移动就发送
WM_SHOW : 接收到show命令就发送
WM_HIDE : 接收到hide命令就发送
WM_TOUCH: 触摸屏信息
应用程式还能够为自己定义额外的消息。为确保他们不用到uC/GUI的消息ID,用户定义的消息从WM_USER后面开始,如:
#define MY_MESSAGE_AAA WM_USER +0
#define MY_MESSAGE_BBB WM_USER +
版权声明
本文为[shzwork]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4000302/blog/4707765
边栏推荐
- CPP (1) installation of cmake
- C++基础知识篇:C++ 基本语法
- Adobe media encoder /Me 2021软件安装包(附安装教程)
- More than 50 object detection datasets from different industries
- What do you think of the most controversial programming ideas?
- Basic knowledge of C + +
- 到底选openstack还是vmware?
- 面部识别:攻击类型和反欺骗技术
- 一万四千字分布式事务原理解析,全部掌握你还怕面试被问?
- Cpp(三) 什么是CMake
猜你喜欢
Analysis of kubernetes service types: from concept to practice
C++基础知识篇:C++ 基本语法
来自不同行业领域的50多个对象检测数据集
来自不同行业领域的50多个对象检测数据集
What magic things can a line of Python code do?
一万四千字分布式事务原理解析,全部掌握你还怕面试被问?
wanxin金融
洞察——风格注意力网络(SANet)在任意风格迁移中的应用
Jingtao project day09
The instanceof operator in ecmascript7 specification
随机推荐
Practice of Xiaoxiong school development board: real equipment access of smart street lamp sandbox experiment
C language I blog assignment 03
洞察——风格注意力网络(SANet)在任意风格迁移中的应用
About the promotion of the whole stack of engineers, from the introduction to give up the secret arts, do not click in to have a look?
Delphi10's rest.json And system.json Step on the pit
Judging whether paths intersect or not by leetcode
Using subprocess residue in supervisor and python multiprocessing
Got timeout reading communication packets解决方法
Kylin on kubernetes' practice on eBay
尾-递
到底选openstack还是vmware?
来自不同行业领域的50多个对象检测数据集
14000 word distributed transaction principle analysis, master all of them, are you afraid of being asked in the interview?
More than 50 object detection datasets from different industries
Judging whether paths intersect or not by leetcode
虚拟DOM中给同一层级的元素设置固定且唯一的key为什么能提高性能
Adobe Lightroom /Lr 2021软件安装包(附安装教程)
Wechat applet request reported 400 error @ requestbody failed to receive
面部识别:攻击类型和反欺骗技术
Got timeout reading communication packets解决方法