emWin 2天速成实例教程000_如何快速入门emWin/ucGUI

2024-04-20 22:08

本文主要是介绍emWin 2天速成实例教程000_如何快速入门emWin/ucGUI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:http://www.neqee.com/content/?149.html


备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果。(2)看完教程000~005就基本会用emWin做项目,其他章节可以需要时再参考。

  emWinucGUI是一样的,只是名称不同而已。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://窗口重绘消息,这个比较难说明白,反正在FramewinWindow窗口之中我们一般是用控

        //,如果要在FramewinWindow窗口之中显示文字或绘制直线、矩形、圆等在这里实现

......

case WM_INIT_DIALOG://初始化消息,创建窗口/控件时有效,比如在这里设置一些控件的初始参数

......

case WM_NOTIFY_PARENT://操作触发消息处理(操作屏幕程序会跑到这里),比如点击按键、点击编辑框(任何的操作)等等......

......

}

句柄= GUI_CreateDialogBox(控件结构体数组回调函数父窗口句柄); //页面创建函数,返回该页面句柄

(1)控件结构体数组包含一个页面的全部使用到的控件。

(2)每个页面都对应一个回调函数,反正界面的任何操作都在这个回调函数里面用程序处理。

(3)每个页面或控件都对应一个句柄,通过句柄和ID可以找到和管理任何的页面或控件,子父窗口/控件是从属关系。

  刚开始接触emWin,千万不要去研究怎么移植驱动或者研究emWin的工作机理,只管用C语言去做界面就好;可以买个STM32+320*240液晶屏的开发板,也可以不买STM32开发板只在emWin脱机模拟仿真开发平台(VCCodeBlocks)上写界面程序,不要怀疑在emWin模拟开发平台上写的界面程序在STM32上运行不了,100%不用修改直接能跑!只有一个地方需要考虑的是:STM32emWin模拟开发平台的内存RAM大小是不一样的,STM32RAM不够的话emWin界面程序是跑不起来的。

  要做到快速开发emWin界面程序,一定要借助脱机模拟仿真开发平台(VCCodeBlocks)在电脑上先做好界面,如果直接在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文件实现:

#define XSIZE_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的配套工具GUIBuilder V530(”软件/资料下载栏目可下载),我们可实现组态、拖放式人机用户界面设计;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.cFramewinDLG.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_如何快速入门emWin/ucGUI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/921442

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显