emWin 2天速成实例教程000_如何快速入门ucGUI/emWin
备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果。(2)看完教程000~005就基本会用emWin做项目,其他章节可以需要时再参考。
emWin和ucGUI是一样的,只是名称不同而已。emWin是德国SEGGER公司一个嵌入式GUI图形库,GUI图形库的概念就好像它是一个平台,我们只需要在这个平台上通过其提供的方法写自己的用户界面应用程序就行,非常简单、便捷。如果没有这个GUI图形库,我们的应用程序还需要考虑按键、编辑框、下拉菜单等控件的绘制,以及控件各种功能的实现,还需要管理各个控件、窗口、页面它们之间的相互关系,还需要做触摸屏/鼠标/键盘的管理等等,这是非常麻烦而且容易出错的事情;如果使用emWin,这些事情都是由emWin去处理的,所有的功能基本上是通过调用API函数完成。
因为emWin的用户应用程序结构分明,开始学习emWin最好的方法是先掌握它的界面应用程序的结构;所有的emWin界面应用程序,对于每个页面,都是由三部分组成:(1)控件结构体数组 (2)回调函数 (3) 页面创建函数;另外补充三个元素:(1)控件句柄 (2)控件ID (3)消息。
static const GUI_WIDGET_CREATE_INFO_aDialogCreate[] =//控件结构体数组
{
控件(ID_0)
控件(ID_1)
......
控件(ID_x)
};
static void _cbDialog(WM_MESSAGE* pMsg)//回调函数
{
case WM_PAINT://窗口重绘消息,这个比较难说明白,反正在Framewin或Window窗口之中我们一般是用控
//件,如果要在Framewin或Window窗口之中显示文字或绘制直线、矩形、圆等在这里实现
......
case WM_INIT_DIALOG://初始化消息,创建窗口/控件时有效,比如在这里设置一些控件的初始参数
......
case WM_NOTIFY_PARENT://操作触发消息处理(操作屏幕程序会跑到这里),比如点击按键、点击编辑框(任何的操作)等等......
......
}
句柄= GUI_CreateDialogBox(控件结构体数组,回调函数,父窗口句柄);//页面创建函数,返回该页面句柄
(1)控件结构体数组包含一个页面的全部使用到的控件。
(2)每个页面都对应一个回调函数,反正界面的任何操作都在这个回调函数里面用程序处理。
(3)每个页面或控件都对应一个句柄,通过句柄和ID可以找到和管理任何的页面或控件,子父窗口/控件是从属关系。
刚开始接触emWin,千万不要去研究怎么移植驱动或者研究emWin的工作机理,只管用C语言去做界面就好;可以买个STM32+320*240液晶屏的开发板,也可以不买STM32开发板只在emWin脱机模拟仿真开发平台(VC或CodeBlocks)上写界面程序,不要怀疑在emWin模拟开发平台上写的界面程序在STM32上运行不了,100%不用修改直接能跑!只有一个地方需要考虑的是:STM32和emWin模拟开发平台的内存RAM大小是不一样的,STM32的RAM不够的话emWin界面程序是跑不起来的。
要做到快速开发emWin界面程序,一定要借助脱机模拟仿真开发平台(VC或CodeBlocks)在电脑上先做好界面,如果直接在STM32开发环境直接做界面,加上对emWin不熟悉,不断下载测试将花费非常非常多的时间!
开始时可以借助emWin的配套工具GUIBuilder做界面然后生成C代码,通过阅读生成的C代码去掌握emWin界面应用程序的框架和编程方法;但GUIBuilder功能比较弱智,因此只能设计一个初步的界面;其实emWin真正强大的地方是通过C语言和API函数实现千变万化的界面,当你熟悉其C语言界面编程方法之后(事实上emWin界面编程是比较简单的),你就会觉得原来做个界面如此简单!
1.需要安装的软件:
(1) emWin脱机模拟仿真软件:codeblocks-13.12mingw-setup(”软件/资料下载”栏目可下载)
(2) 下载并解压emWin模拟器版本:SeggerEval_WIN32_MSVC_MinGW_GUI_V528(”软件/资料下载”栏目可下载)
2. 运行emWin自带的DEMO程序
(1) 解压SeggerEval_WIN32_MSVC_MinGW_GUI_V528之后用CodeBlocks打开工程工程文件:SimulationTrial.cbp然后编译工程:
(2) 运行emWin自带的DEMO程序:
完了,是不是特别简单?
3.实现最简单的emWin界面
备注:如需要修改emWin的分辨率,可以通过修改..\Config\LCDConf.c文件实现:
#defineXSIZE_PHYS 320
#define YSIZE_PHYS 240
(1)删除SeggerEval_WIN32_MSVC_MinGW_GUI_V528/Application目录下的所有文件(只剩下GUIDEMO_Start.c),并修改GUIDEMO_Start.c:
#include "dialog.h"
void MainTask(void)
{
GUI_Init();//初始化emWin/ucGUI
CreateFramewin(WM_HBKWIN); //创建窗体,父窗体是桌面背景
while(1) {GUI_Delay(20);} //调用GUI_Delay函数延时20MS(最终目的是调用GUI_Exec()函数)
}
利用emWin的配套工具GUIBuilderV530(”软件/资料下载”栏目可下载),我们可实现组态、拖放式人机用户界面设计;GUIBuilder操作界面非常简单、一目了然;GUIBuilder生成的界面文件是标准C文件,将生成的C文件加到emWin工程中并在emWin这个图形库平台上运行,即可显示你所设计的界面;每生成一个界面C文件即对应一个页面,如果要设计多个页面的界面怎么办?生成多个界面C文件并在回调函数的操作触发消息中用WM_HideWindow()和WM_ShowWindow()函数实现界面切换程序即可:
(2)值得注意的是emWin的每个界面都必须有一个Framewin/Window控件作为父窗体,这里我们添加一个Framewin控件做父窗体:
备注:如果我需要一个纯色的背景桌面怎么办?那就放一个Window做父窗体(保存为单独C文件),其他Framewin/Window都作为它的子窗体。
备注:一定要记住emWin子父窗体/控件概念的重要性(前面有说)!
(3)添加一个Button控件并右键修改Button名称和字体(Button控件还有很多修改属性的API函数,只是GUIBuilder没有而已,可通过修改C文件现实,这个时候需要查阅emWin说明书的Button控件API函数):
小技巧:放置xxxx控件之后不要用鼠标移动,用上下左右建移动更容易对齐(步进是5)。
(4)添加一个Checkbox控件并设置文字、字体、颜色等(Checkbox控件还有很多修改属性的API函数,只是GUIBuilder没有而已,可通过修改C文件现实,这个时候需要查阅emWin说明书的Checkbox控件API函数):
小技巧:放置xxxx控件之后不要用鼠标移动,用上下左右建移动更容易对齐(步进是5)。
(5)将界面保存为C文件:
(6)将刚才用GUIBuilder生成的C文件”FramewinDLG.c”复制到SeggerEval_WIN32_MSVC_MinGW_GUI_V528/Applicatio目录,并用CodeBlocks打开工程文件:SimulationTrial.cbp
(7)删除工程Applicatio下面原来的文件并把GUIDEMO_Start.c和FramewinDLG.c添加进来,然后编译工程:
(8)运行:
(10)到目前为止,在Framewin窗体上的Button和Checkbox控件还是完全独立的,也就是除了能点击和显示以外,还没有任何的功能,那么我们怎么为这两个控件添加功能程序呢?比如我们想通过Button控件去控制Checkbox控件的选择状态,那么我们可以通过修改FramewinDLG.c文件的程序实现,在WM_NOTIFY_PARENT消息中(操作屏幕时程序跑到这里)加入以下程序:
hItem = WM_GetDialogItem(pMsg->hWin, ID_CHECKBOX_0);//获取ID_CHECKBOX_0控件句柄
if(CHECKBOX_IsChecked(hItem)) CHECKBOX_Uncheck(hItem);//ID_CHECKBOX_0取消选择
else CHECKBOX_Check(hItem);// ID_CHECKBOX_0打勾选择
改为中文显示:
备注:GUIBuilder工具目前不支持中文,因此只能在CodeBlocks做界面模拟仿真时再改为中文显示。
(1)在例程中加入以下两个文件(可以在GLCD资料包的”helloPRJ_WINemWin530noOS_CodeBlocks_GBK.rar”例程中找到),GBK_16m16.c是字库C文件,GUI_UC_EncodeGBK.c是设置emWin为GBK编码C文件:
(2)设置emWin为GBK编码:
(3)修改中文显示:
备注:使用GBK编码Code::Blocks需要做以下设置,否则保存C文件时将自动被改为UTF8编码。
附录:emWin说明书解读
emWin说明书有一千多页,对于初学者来说,通过emWin说明书来学会做界面是不可能的(不管花多少时间),emWin说明书唯一的用处是在做界面的过程中查阅相关的API函数,其API函数总共分三大类:
(1)2D绘图类,函数以”GUI_”开头,包括文字显示(注:不是控件上面的文字)、线/圆/矩形等的绘制、图片/影片显示、字体/颜色设置等等...
(2)窗口管理类,函数以”WM_”开头,比如隐藏/显示某个窗口、禁止/使能某个窗口、使某个窗口或区域无效以重绘、移动某个窗口/控件、判断某个窗口是否可见或被覆盖等等...
(3)控件类,函数以”XXXX_”(控件名)开头:
emWin 2天速成实例教程000_如何快速入门ucGUI/emWin的更多相关文章
- JasperReports入门教程(一):快速入门
JasperReports入门教程(一):快速入门 背景 现在公司的项目需要实现一个可以配置的报表,以便快速的适应客户的需求变化.后来在网上查资料发现可以使用JasperReports + Jaspe ...
- Expression Blend实例中文教程(9) - 行为快速入门Behaviors
在Blend强大的设计功能支持下,设计人员和开发人员可以无代码实现Silverlight/WPF动画效果,例如上文介绍的StoryBoard,就是一个典型例子,设计人员和开发人员仅需提供必要元素,即可 ...
- Expression Blend实例中文教程(2) - 界面快速入门
上一篇主要介绍Expression系列产品,另外概述了Blend的强大功能,本篇将用Blend 3创建一个新Silverlight项目,通过创建的过程,对Blend进行快速入门学习. 在开始使用Ble ...
- Spring Boot 2 快速教程:WebFlux 快速入门(二)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 02:WebFlux 快速入门实践 文章工程: JDK 1.8 ...
- spring boot入门教程——Spring Boot快速入门指南
Spring Boot已成为当今最流行的微服务开发框架,本文是如何使用Spring Boot快速开始Web微服务开发的指南,我们将使创建一个可运行的包含内嵌Web容器(默认使用的是Tomcat)的可运 ...
- SignalR系列教程:SignalR快速入门
---恢复内容开始--- 本篇是SignalR系列教程的第一篇,本篇内容介绍了如何创建SignalR应用,如何利用SignalR搭建简易的聊天室等,本篇内容参考自:http://www.asp.net ...
- Shell脚本深入教程(1):快速入门
Shell脚本基础入门 Bash注释 Bash只支持单行注释,使用#开头的都被当作注释语句: # 整行注释 echo hello world # 行尾注释 通过Bash的一些特性,可以取巧实现多行注释 ...
- Silverlight,Windows 8应用开发实例教程系列汇总
Kevin Fan分享开发经验,记录开发点滴 Silverlight,Windows 8应用开发实例教程系列汇总 2012-06-18 01:05 by jv9, 2145 阅读, 3 评论, 收藏, ...
- laravel 中CSS 预编译语言 Sass 快速入门教程
CSS 预编译语言概述 CSS 作为一门样式语言,语法简单,易于上手,但是由于不具备常规编程语言提供的变量.函数.继承等机制,因此很容易写出大量没有逻辑.难以复用和扩展的代码,在日常开发使用中,如果没 ...
随机推荐
- Eclipse的调试功能的10个小窍门[转]
原文链接:http://www.importnew.com/6164.html 你可能已经看过一些类似“关于调试的N件事”的文章了.但我想我每天大概在调试上会花掉1个小时,这是非常多的时间了.所以非常 ...
- python基础 列表 的用法及介绍
列表 首先定义一个列表 声明列表 列表名字=[值1,值2] list=[1,2,3,4,5] 这是一个列表,列表中有五个元素(1,2,3,4,5) 显示list列表 print list 输出 ...
- BZOJ 1192: [HNOI2006]鬼谷子的钱袋 [娱乐]
题意: n个数分组,使得小于n的每个数都能表示出来,最少几组 就是“最优集合”的超级弱化版.....每次+=now+1 然后一个貌似科学的方法是n二进制拆分 #include <iostream ...
- WebSocket 示例
websocket应运而生 在WebSocket规范提出之前,开发人员若要实现带有即时通信.实时数据.订阅推送等功能的应用实时性较强的功能,经常会使用的解决方法是 Comet. Comet是一种服务器 ...
- [Python Study Notes]列表操作
列表操作 a.切片 >>> names = ["Alex","Tenglan","Eric","Rain&quo ...
- Linux系统Go开发环境搭建
Go 语言是由谷歌的科学家开发的,并开源的新语言,被誉为"21世纪的C语言",它的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得 ...
- 织梦autoindex应用 dedecms循环中判断第几条数据
arclist 标签下使用 [field:global.autoindex/] 默认从1开始 {dede:arclist row='10' titlelen='48' typeid='1' chann ...
- SVN高级
#查找有关svn关键字的目录及文件 find / -name "*svn*" find / -name "*Svn*" find / -name "* ...
- 15-谜问题(深拷贝、LC检索、面向对象编程)
问题描述: 在一个分成16格的方形棋盘上,放有15块编了号码的牌.对这些牌给定一种初始排列,要求通过一系列的合法移动将这一初始排列转换成目标排列. 这个问题解决时用到了L-C检索.在检索的过程中计算估 ...
- python3.6+django2.0 一小时学会开发一套学员管理系统demo
1.在pycharm中新建project demo1 添加app01 点击create按钮完成新建 2.在demo项目目录下新建目录static,并在settings.py中追加代码: STATICF ...