ucgui做界面切换
uCGUI使用

uCGUI使⽤最好多参考⼏篇⽂章,⽐如UC/GUI中⽂⼿册与emWin5_UM_SC0:画图函数GUI_DrawRect:在当前窗⼝中的指定位置绘制矩形(不填充,画线颜⾊为前景⾊)void GUI_DrawRect(int x0, int y0, int x1, int y1);在当前窗⼝中的指定位置绘制填充的矩形区域(填充前景⾊)(填充前景⾊)GUI_FillRect:在当前窗⼝中的指定位置绘制填充的矩形区域:清除矩形区域(为矩形区域填充背景颜⾊,图形界⾯⽤填充背景⾊达到清除屏幕的矩形区域填充背景颜⾊,图形界⾯⽤填充背景⾊达到清除屏幕的GUI_ClearRect:清除矩形区域(为)效果)效果1:存储设备不使⽤存储设备时,绘制操作直接写⼊显⽰器。
屏幕在执⾏绘制操作时随时更新,从⽽在进⾏各种更新时使屏幕闪烁。
如果在此过程中使⽤存储设备,则所有绘制操作都在存储器中执⾏。
仅在所有操作都完成后才将最终结果显⽰在屏幕上,其优点是没有闪烁。
如果不使⽤存储设备,则可以看到⼀步步的绘制操作效果,缺点是会出现显⽰器闪烁。
使⽤存储设备时,⼀次可见到所有例程的效果,就象单次操作⼀样,不能实际看见中间步骤。
以下例程是在使⽤存储设备时通常会调⽤的,基本⽤法⾮常简单:1. 创建存储设备(使⽤GUI_MEMDEV_Create() )。
2. 激活它(使⽤GUI_MEMDEV_Select() )。
3. 执⾏绘制操作。
4. 将结果复制到显⽰器中(使⽤GUI_MEMDEV_CopyToLCD() )。
5. 不再需要它时,删除该存储设备(使⽤ GUI_MEMDEV_Delete() )。
2:WM窗⼝管理器回调例程:回调例程由⽤户程序定义,指⽰在特定事件出现时图形系统调⽤特定的函数。
它们通常⽤于在窗⼝内容更改时⾃动重绘窗⼝。
窗⼝管理器的默认特性是向每个需要重绘的窗⼝发送⼀条 WM_PAINT 。
当⽤户对窗⼝有操作时,WM会发送相应的消息给该窗⼝,窗⼝可通过回调函数根据消息直接对屏(没有⽤存储设备时)或对窗⼝的存储设备进⾏操作再拷贝到屏幕上,具体的消息说明可以参考emWin的中⽂⼿册。
ucgui gui_lock()原理

ucgui gui_lock()原理ucgui 并不是我所熟知的某个特定的GUI库,可能是某个特定环境或定制版本中的GUI库。
不过,基于一般的GUI库设计原理,gui_lock() 函数通常用于锁定GUI系统,防止在关键操作期间发生意外的界面更新或重绘。
以下是关于 gui_lock() 函数可能的工作原理的一般性描述:工作原理:1.状态管理:gui_lock() 函数会更改GUI库的内部状态,将GUI系统标记为锁定状态。
这通常通过设置一个标志位或计数器来实现。
2.阻止重绘:当GUI系统处于锁定状态时,任何尝试更新或重绘界面的操作都会被阻止或延迟。
这确保了在锁定期间,界面不会发生变化,从而避免了可能的界面闪烁或错误显示。
3.同步和异步操作:在某些情况下,GUI操作可能是异步的,即它们会在后台线程或定时任务中执行。
gui_lock() 需要确保即使在这些异步操作中,锁定状态也能被正确识别和处理。
4.嵌套锁定:有些GUI库支持嵌套锁定,即多次调用 gui_lock() 会增加锁定计数,而只有对应的 gui_unlock() 调用次数足够多时,GUI系统才会真正解锁。
这可以防止由于误操作导致的锁定和解锁不匹配问题。
5.解锁操作:通常会有一个与 gui_lock() 对应的 gui_unlock() 函数,用于解除锁定状态。
当GUI系统解锁时,之前被阻止的界面更新操作可以继续执行。
示例伪代码:c复制代码// 假设有一个全局变量来表示GUI的锁定状态int gui_locked = 0;void gui_lock() {gui_locked++;// 可能还有其他操作,如禁用定时器或事件处理等}void gui_unlock() {if (gui_locked > 0) {gui_locked--;// 如果解锁完成,恢复定时器或事件处理if (gui_locked == 0) {// 触发界面更新或重绘}}}注意事项:•谨慎使用:锁定GUI系统应该谨慎使用,因为它会阻止界面的正常更新。
第十讲 uCGUI简介

1 GUI 概述 1.1 GUI的功能
• GUI的功能 以API函数的形式向应用程序提供图 形界面的操作功能,如描点、画线、填 充、显示控件、字体管理等功能。 可以降低在嵌入式系统开发过程中的 图形操作界面的开发难度,提高效率, 美化界面。
第十讲 uCGUI简介 第十讲 uCGUI 简介
1、GUI 概述 2、GUI常见种类 3、uCGUI 的特点 4、uCGUI的功能函数 5、uCGUI的使用
下图为颜色模式555的效果图:
4 uC/GUI 的功能函数 4.4.6 定义物理调色板
4) 定义物理调色板
在LCDConf.h中定义4种颜色(全部为灰色) 的调色板:
4 uC/GUI 的功能函数 4.4.7 颜色管理函数
4) 颜色管理函数(1)
4 uC/GUI 的功能函数 4.4.8 颜色管理函数
3 uCGUI的特点 3.1.3 uC/GUI 概述
1) uCGUI的特征
• 视窗显示和管理功能; • 支持触摸屏和鼠标的输入; • 具有功能全面的PC机实用软件工具,如模拟 器、观察器、位图转换器、字体转换器等。
3 uCGUI的组成 3.1.4 uC/GUI 概述
2) uCGUI的组成 通常GUI文件放 在工程文件的根目
5) 字体操作函数(1) uCGUI支持ASC11,IOS8859-1,Unicode
字体编码;有宽位图字体、比例位图字体、
2bpp (bit/pixel)和4bpp比例位图等4种字体
字体的选择在GUIConf.h中定义,字体
需要与应用程序连接在一起。
4 4.5.2 增加字体 uC/GUI 的功能函数
▪文本显示函数 ▪数值显示函数
▪平面(2D)图形库
STM32平台的μC/GUI移植与图形界面设计

STM32平台的μC/GUI移植与图形界面设计摘要:μC/GUI是一种专为嵌入式应用设计的通用图形接口软件。
本文详细介绍了μC /GUI的结构框架和基于STM32平台的μC/OS-II上的μC/GUI移植过程,并在此基础上进行图形界面设计;阐述了μC/GUI的窗口管理机制,提出了实现μC/GUI中文小型字库的两种方法并采用存储设备解决了图形显示的闪烁问题。
关键词:μC/GUI移植;STM32平台;图形界面;中文小型字库;存储设备引言嵌入式系统的图形用户界面,要求具有占用资源少、性能高、可靠性高、可移植、可配置等特点,μC/GUI就是这样一种专门为嵌入式应用设计的图形用户界面软件。
μC/GUI 可应用于多任务环境中,同时使用实时操作系统与μC/GUI,既可以发挥优先级的实时性,又能实现良好的人机界面。
本文使用Cortex-M3内核的STM32平台,介绍了基于STM32平台的μC/OS-II上的μC/GUI移植过程,并在此基础上开发了基于μC/GUI的图形用户界面。
1 μC/GUI结构框架1.1 μC/GUI的文件组织μC/GUI软件采用模块化组织架构,其中较为重要的文件目录是配置文件目录Config和GUI库文件目录。
考虑到未来升级方便,建议保持μC/GUI原有的目录结构,这样升级到新版本时只要覆盖原文件目录即可,而不会改变整个工程的文件路径。
μC/GUI是一个源代码开放的图形系统,它提供了丰富的资源,包括二维绘图库,多字体、可扩充的字符集,Unicode,位图显示,多级RGB颜色管理及灰度处理调整机制,动画优化显示,具有Windows风格的对话框和预定义控件(按钮、编辑框、列表框、进度条、单选复选框、滑动条等);同时,支持键盘、鼠标、触摸屏等输入设备和双LCD的输出,提供占用极少RAM的窗口管理体系。
各个子目录的路径及功能支持如表1所列。
1.2 μC/GUI的层次结构μC/GUI内核提供多种图形显示功能,用户程序通过API函数接口调用μC/GUI函数库中的各个功能函数,然后各个功能函数通过调用硬件驱动实现图形界面显示。
第5章emWin(UCGUI)模拟器的使用方法

第5章emWin(UCGUI)模拟器的使用方法第5章emWin5.24模拟器的使用方法本期主要是带领大家学习emWin5.24模拟器的使用,主要内容是学习如何运行emWin5.24安装包里面的例子以及emWin查看器的使用。
5. 1 emWin5.24的使用方法5. 2 emWin5.24查看器的使用方法5. 3 总结5.1e m W i n5.24的使用方法如果没有emWin5.24模拟器的,需要到官网下模拟器。
解压emWin5.24的安装包,用VC6.0打开后的效果是这样的:默认的情况下运行的是emWin官方的DEMO,点击下面这两个按钮后运行:5.1.1如何改变显示界面的大小以前的那些版本,改变显示界面大小的时候,完全的没有反应,现在的这个模拟器的版本完全的没有问题的,默认的情况下是320*240的。
运行官方的DEMO后显示效果如下:现在我们把分辨率改成480*272,显示效果就是下面这个样子的。
5.1.2如何在这个工程上运行官方其它例子比如我们要运行这个例子2DGL_BMPExport.c。
这里我们需要把Application文件从工程里面独立出去第一步:●第二步:勾选红色方块就可以了。
●第三步第四步:这里把这个对勾去掉设置完以后就可以运行这个例子了。
5.1.3如何运行下面这种官方例子比如下面这种例子:冲突,所以要把下面这里的独立出来(方法和上面讲的一样)。
5.2e m W i n5.24查看器的使用方法关于emWin5.24查看器的位置在模拟器软件包的这个路径下:查看器的使用方法也比较简单,用户可以先运行emWin模拟器再打开查看器或者先运行查看器再打开emWin模拟器都可以的。
下面是模拟器的实际显示效果:查看器在多层显示的时候比较有用。
5.3总结官方的模拟器是个非常好的东西,一般情况下,界面比较麻烦的可以先在上面做好,然后再移植到开发板上面。
从下期教程开始,我们将讲解STemWin中API的使用。
UCGUI的模拟器UCGUISim详解

UCGUI的模拟器UCGUISim详解本文转自感谢原作者(最近发现该网站已经撤销,不知道作者近况如何.想当初,他对我理解ucgui提供了很多支持和帮助呢!)。
联系方式: @一、问题的由来-----模拟器完成了什么在官方发布的UCGUI的源码包当中,附有很多的示例,源码与示例都打包成一个VC工程,在这个工程中我们可以编译和运行UCGUI的示例,进行UCGUI的图形编程,非常方便,这个工程结构下:Application-------UCGUI应用程序目录。
Config-------------UCGUI配制文件目录。
GUI----------------UCGUI源码文件。
Simulation--------模拟器库文件、模拟器头文件目录,主要有GUISim.lib这个提供模拟器的库文件。
System-------------应用程序的接口调用主文件,即调用用户的MainTask函数的m ain函数。
在这个官方提供的包中,我们进行UCGUI的图形编程时,大多都是将要写的程序源文件放加到Application目录中,其中应用程序中必不可少要提供的一个函数是MainTask(),好奇的朋友会发觉,我们程序并没创建窗口,为什么一运行就有窗口界面并有一个LCD 显示屏显示出自己的UCGUI程序的运行效果出来,其实这些我们看不到的代码都是写在GUISim.lib这个库文件当中的,为了了解模拟器具体做了些什么,我通过反编译,还原了官方模拟器的源码,下面详细介绍模拟器的构成[以下均为官方模拟器采用的方法]。
GUISim.lib主要完成以下几件事,具体的模块划分将在文中后面描述:1. 创建模拟器主窗口,这个窗体包括一些模拟器控制菜单,如打开LOG记录/打开调色板显示窗体/新建LCD模拟器窗体,以及暂停/继续模拟器。
2. 创建一个LCD模拟显示窗口并初始化其显示所需的各种数据结构,LCD窗口的大小由UCGUI中LCDConf.h中配制时指定(LCD_XSIZE/LCD_YSIZE),及其它的诸如每个象素占用多少位(LCD_BITSPERPIXEL),首先分配一块足够大的显存(4M)并初始化这块数据为0,每个象素占用不大于8位时模拟显示屏幕需要用到8位图,还必须初始化要用到的调色板。
uCGUI使用

uCGUI使用最好多参考几篇文章,比如UC/GUI中文手册与emWin5_UM_SC0:画图函数GUI_DrawRect:在当前窗口中的指定位置绘制矩形(不填充,画线颜色为前景色)void GUI_DrawRect(int x0, int y0, int x1, int y1); GUI_FillRect:在当前窗口中的指定位置绘制填充的矩形区域(填充前景色)GUI_ClearRect:清除矩形区域(为矩形区域填充背景颜色,图形界面用填充背景色达到清除屏幕的效果)1:存储设备不使用存储设备时,绘制操作直接写入显示器。
屏幕在执行绘制操作时随时更新,从而在进行各种更新时使屏幕闪烁。
如果在此过程中使用存储设备,则所有绘制操作都在存储器中执行。
仅在所有操作都完成后才将最终结果显示在屏幕上,其优点是没有闪烁。
如果不使用存储设备,则可以看到一步步的绘制操作效果,缺点是会出现显示器闪烁。
使用存储设备时,一次可见到所有例程的效果,就象单次操作一样,不能实际看见中间步骤。
以下例程是在使用存储设备时通常会调用的,基本用法非常简单:1. 创建存储设备(使用GUI_MEMDEV_Create() )。
2. 激活它(使用GUI_MEMDEV_Select() )。
3. 执行绘制操作。
4. 将结果复制到显示器中(使用GUI_MEMDEV_CopyToLCD() )。
5. 不再需要它时,删除该存储设备(使用GUI_MEMDEV_Delete() )。
2:WM窗口管理器回调例程:回调例程由用户程序定义,指示在特定事件出现时图形系统调用特定的函数。
它们通常用于在窗口内容更改时自动重绘窗口。
窗口管理器的默认特性是向每个需要重绘的窗口发送一条 WM_PAINT 。
当用户对窗口有操作时,WM会发送相应的消息给该窗口,窗口可通过回调函数根据消息直接对屏(没有用存储设备时)或对窗口的存储设备进行操作再拷贝到屏幕上,具体的消息说明可以参考emWin的中文手册。
uCGUIBuilder使用说明

一、ucGUBuilder使用方法 (2)1,新建ucGUI窗体 (2)2、设置窗体的属性 (3)3、向窗体添加控件 (4)二、V ersion 2.1.0.5 新增功能 (9)1、新增C语言语法高亮显示 (9)2、支持设计的窗体保存为文件,并可以打开 (9)3、对所有控件属性添加了Description (12)4、保存窗体布局 (13)三、Version 3.0.0.0 新增功能 (15)1、支持窗体设计器基本操作 (15)2、多控件操作 (15)3、文件关联 (16)4、在线检查更新 (18)5、自定义控件ID (20)四、Version 3.1.0.0新增功能 (22)1、添加了控件ID自动增加功能 (22)2、用户自定义字体 (22)3、中英文切换 (23)4、自动检查更新 (24)6、问题反馈或提建议 (25)五、Version 4.0新增功能 (27)1、代码分离 (27)2、添加编辑器工具栏 (28)3、内嵌VC编译器能直接运行模拟器 (29)4、如何使用代码自动完成功能 (30)声明:此程序用C#开发,需要.Net Framework 3.5或跟高版本支持大家在测试的过程中发现什么BUG或者有什么建议可以发Email:ucguibuilder@给我,一、ucGUBuilder使用方法1,新建ucGUI窗体或者单击新建窗体设计器工具栏按钮或者点下拉箭头选择新建窗体设计器新建后的效果:2、设置窗体的属性(包括大小,标题栏文本,……)3、向窗体添加控件(1)、在工具箱单击选中你要添加的控件将鼠标移动到窗体上,鼠标光标变成了十字形然后按住鼠标左键,拖动会出现一个矩形,拖动到合适大小,松开鼠标,在刚才矩形区域的地方就会添加一个同样大小的在工具箱选中的控件。
或者在工具箱中选中控件,将鼠标移动到窗体上,鼠标光标变成十字形时,单击鼠标,也能在单击处添加一个默认大小的选择的控件。
4、调整控件的大小及属性把鼠标移动到选中的控件四周的小方块上,当鼠标指针变成箭头时,按住鼠标左键就可向对应的方向调整控件大小,把鼠标移动到控件上,按住鼠标左键就可拖动控件,移动控件位置也可以,修改控件属性,来调整控件二、Version 2.1.0.5 新增功能1、新增C语言语法高亮显示2、支持设计的窗体保存为文件,并可以打开单击保存按钮或者菜单-》保存会弹出保存文件对话框选择路径,输入文件名即可保存(保存格式为ucfrm 格式)保存完毕。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这次在用ucgui做界面切换的时候,决定不给每个菜单界面都创建一个对话框,和网友讨论的过程中,得出两种方法,一位网友说的是STM32的存储空间足够,可以先把自己所要用到的控件全部建立好,然后根据需要去设置控件是显示还是隐藏。
另一位网友认为这样有点浪费内存,采用的方法是,先建立好一个对话框,然后根据自己的需要去删除和新建控件。
之后我就选择了第二种方法,在菜单的切换中去删除和新建控件。
可能是自己太菜了,第一次删除控件和新建控件就出了问题。
问题是这样的:我先创建一个对话框作为欢迎界面(两个TEXT控件和一个BUTTON控件)
hWinMenu = GUI_CreateDialogBox(_aDialogCreate,GUI_COUNTOF(_aDialogCreate),_cbWelcome,0,0,0) ;
我的想法是,点击按钮后删掉按钮控件和两个TEXT控件。
然后再新建4个按钮控件。
1.hButton[0] = BUTTON_CreateAsChild(30,26,115,70,hWinMenu ,GUI_ID_BUTTON1,WM_CF_SH
OW);
2.hButton[1] = BUTTON_CreateAsChild(30,124,115,70,hWinMenu,GUI_ID_BUTTON2,WM_CF_S
HOW);
3.hButton[2] = BUTTON_CreateAsChild(188,26,115,70,hWinMenu,GUI_ID_BUTTON3,WM_CF_S
HOW);
4.hButton[3] = BUTTON_CreateAsChild(188,124,115,70,hWinMenu,GUI_ID_BUTTON4,WM_CF_S
HOW);
5.BUTTON_SetBitmapEx(hButton[0],0,&bmqd,30,10);
6.BUTTON_SetBitmapEx(hButton[1],0,&bmpf,30,10);
7.BUTTON_SetBitmapEx(hButton[2],0,&bmsz,30,10);
8.BUTTON_SetBitmapEx(hButton[3],0,&bmdc,30,10);
9.BUTTON_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_BUTTON0));
10.TEXT_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_TEXT0));
11.TEXT_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_TEXT1));
这样写了之后的结果是,原先的控件被删除了,我所需要的4个按钮新建成功。
但是此时出现了一个问题,我仿真的时候发现,我按下新建的按钮时,按键颜色虽然有变化但是回调函数里并没有收到按钮传递给父窗口的按钮按下的消息。
这样我就很纳闷的总是想不出是为什么。
通过查看新建对话框函数的源代码之后有了一点发现
hWinMenu=GUI_CreateDialogBox(_aDialogCreate,GUI_COUNTOF(_aDialogCreate),_cbWelcome,0,0,0);
我是想查看一下hWinMenu是不是我之后新建按钮所需要的父窗口句柄。
view plaincopy to clipboardprint?
1.WM_HWIN GUI_CreateDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget, int NumWid
gets, WM_CALLBACK* cb, WM_HWIN hParent,
2.int x0, int y0)
3.{
4. WM_HWIN hDialog = paWidget->pfCreateIndirect(paWidget, hParent, x0, y0, cb); /* Crea
te parent window */
5. WM_HWIN hDialogClient = WM_GetClientWindow(hDialog);
6. WIDGET_OrState(hDialog, paWidget->Flags);
7. WM_ShowWindow(hDialog);
8. WM_ShowWindow(hDialogClient);
9. while (--NumWidgets > 0) {
10. WM_HWIN hChild;
11. paWidget++;
12. hChild = paWidget->pfCreateIndirect(paWidget, hDialogClient, 0, 0, 0); /* Create child w
indow */
13. WM_ShowWindow(hChild);
14. }
15. WM_SetFocusOnNextChild(hDialog); /* Set the focus to the first child */
16. WM_SendMessageNoPara(hDialogClient, WM_INIT_DIALOG);
17. return hDialog;
18.}
可以看出在这个函数里,还获取了一个hDialogClient客户区的句柄,这时候就觉得自己之前想错了,我新建的按钮是以子窗口形式建立的,最后为什么传递不了消息呢,这就应该是我所填写的父窗口句柄搞错了。
最后我把代码改成了这样:
view plaincopy to clipboardprint?
1.void mainMenu()
2.{
3. BUTTON_Handle hButton[4];
4. WM_HWIN hWinClient = WM_GetClientWindow(hWinMenu);
5. if(menuStruct[menuIndex].MenuStat == 0)
6. {
7. optStat();
8. hButton[0] = BUTTON_CreateAsChild(30,26,115,70,hWinClient ,GUI_ID_BUTTON1,
WM_CF_SHOW);
9. hButton[1] = BUTTON_CreateAsChild(30,124,115,70,hWinClient,GUI_ID_BUTTON2,
WM_CF_SHOW);
10. hButton[2] = BUTTON_CreateAsChild(188,26,115,70,hWinClient,GUI_ID_BUTTON3,
WM_CF_SHOW);
11. hButton[3] = BUTTON_CreateAsChild(188,124,115,70,hWinClient,GUI_ID_BUTTON4,
WM_CF_SHOW);
12. BUTTON_SetBitmapEx(hButton[0],0,&bmqd,30,10);
13. BUTTON_SetBitmapEx(hButton[1],0,&bmpf,30,10);
14. BUTTON_SetBitmapEx(hButton[2],0,&bmsz,30,10);
15. BUTTON_SetBitmapEx(hButton[3],0,&bmdc,30,10);
16. BUTTON_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_BUTTON0));
17. TEXT_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_TEXT0));
18. TEXT_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_TEXT1));
19. }
20.}
然后就传递消息没有问题了。
呵呵,问题解决了,又多了一次经验,嘿嘿。