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

emWin 2天速成实例教程000_如何快速入门ucGUI/emWinemWin是一个嵌入式GUI图形库,GUI图形库的概念就好像它是一个平台,我们只需要在这个平台上通过其提供的方法写自己的用户界面应用程序就行,非常简单、便捷。如果没有这个GUI图形库,我们的应用程序还需要考虑按键、编辑框、下拉菜单等控件的绘制和实现,还需要管理各个控件、窗口、页面它们之间的相互关系,还需要做触摸屏/鼠标/键盘的管理等等,这是非常麻烦而且容易出错的事情…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

备注:(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://窗口重绘消息,这个比较难说明白,反正在FramewinWindow窗口之中我们一般是用控

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

……

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界面程序,一定要借助脱机模拟仿真开发平台(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然后编译工程:

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

 

(2) 运行emWin自带的DEMO程序:

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

完了,是不是特别简单?

 

 

 

 

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 2天速成实例教程000_如何快速入门ucGUI/emWin

 

利用emWin的配套工具GUIBuilderV530(”软件/资料下载”栏目可下载),我们可实现组态、拖放式人机用户界面设计;GUIBuilder操作界面非常简单、一目了然;GUIBuilder生成的界面文件是标准C文件,将生成的C文件加到emWin工程中并在emWin这个图形库平台上运行,即可显示你所设计的界面;每生成一个界面C文件即对应一个页面,如果要设计多个页面的界面怎么办?生成多个界面C文件并在回调函数的操作触发消息中用WM_HideWindow()和WM_ShowWindow()函数实现界面切换程序即可:

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

 

(2)值得注意的是emWin的每个界面都必须有一个Framewin/Window控件作为父窗体,这里我们添加一个Framewin控件做父窗体:
备注:如果我需要一个纯色的背景桌面怎么办?那就放一个Window做父窗体(保存为单独C文件),其他Framewin/Window都作为它的子窗体。
备注:一定要记住emWin子父窗体/控件概念的重要性(前面有说)!

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

 

(3)添加一个Button控件并右键修改Button名称和字体(Button控件还有很多修改属性的API函数,只是GUIBuilder没有而已,可通过修改C文件现实,这个时候需要查阅emWin说明书的Button控件API函数):
小技巧:放置xxxx控件之后不要用鼠标移动,用上下左右建移动更容易对齐(步进是5)

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

 

(4)添加一个Checkbox控件并设置文字、字体、颜色等(Checkbox控件还有很多修改属性的API函数,只是GUIBuilder没有而已,可通过修改C文件现实,这个时候需要查阅emWin说明书的Checkbox控件API函数):

小技巧:放置xxxx控件之后不要用鼠标移动,用上下左右建移动更容易对齐(步进是5)

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

 

(5)将界面保存为C文件:

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

 

(6)将刚才用GUIBuilder生成的C文件”FramewinDLG.c”复制到SeggerEval_WIN32_MSVC_MinGW_GUI_V528/Applicatio目录,并用CodeBlocks打开工程文件:SimulationTrial.cbp

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

 

(7)删除工程Applicatio下面原来的文件并把GUIDEMO_Start.c和FramewinDLG.c添加进来,然后编译工程:

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

 

(8)运行:

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

 

(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打勾选择

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


改为中文显示:

备注:GUIBuilder工具目前不支持中文,因此只能在CodeBlocks做界面模拟仿真时再改为中文显示。

(1)在例程中加入以下两个文件(可以在GLCD资料包的”helloPRJ_WINemWin530noOS_CodeBlocks_GBK.rar”例程中找到),GBK_16m16.c是字库C文件,GUI_UC_EncodeGBK.c是设置emWin为GBK编码C文件:

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

(2)设置emWin为GBK编码:

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

(3)修改中文显示:

备注:使用GBK编码Code::Blocks需要做以下设置,否则保存C文件时将自动被改为UTF8编码。

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


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


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

源码/软件下载






附录:emWin说明书解读

emWin说明书有一千多页,对于初学者来说,通过emWin说明书来学会做界面是不可能的(不管花多少时间),emWin说明书唯一的用处是在做界面的过程中查阅相关的API函数,其API函数总共分三大类:

(1)2D绘图类,函数以”GUI_”开头,包括文字显示(注:不是控件上面的文字)、线/圆/矩形等的绘制、图片/影片显示、字体/颜色设置等等…

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


(2)窗口管理类,函数以”WM_”开头,比如隐藏/显示某个窗口、禁止/使能某个窗口、使某个窗口或区域无效以重绘、移动某个窗口/控件、判断某个窗口是否可见或被覆盖等等…

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


(3)控件类,函数以”XXXX_”(控件名)开头:

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181926.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker部署redis哨兵集群_redis部署安装

    docker部署redis哨兵集群_redis部署安装Docker安装Docker部署redis在dockerhub上可以看到有redis的官方镜像不去网站,也可以通过如下命令查看有那些镜像可用Dockersearch命令dockersearchredis拉取redis镜像Dockerpull命令这里我们拉取官方的最新版本的镜像:dockerpullredis:latest查看本地镜像Dockerimages命令有redis和hello-world运行容器Dockerrun命令d

    2022年10月18日
    4
  • Java中Scanner类的使用方法(小白专属)

    Java中Scanner类的使用方法(小白专属)一、Scanner类简介Java5新引入了java.util.Scanner类,主要用于扫描用户从控制台输入文本的程序。即当用户需要输入数据时,调用java.util包中的Scanner类,Scanner类能获取用户所输入的数据。二、如何使用Scanner类?(按步骤)先导入java.util.Scanner包;创建Scanner类的对象(基本语法)创建一个变量用于接收输入的数据,通过调用Scanner类的对象scanner来调用Scanner类中的next方法(控制台将等待

    2022年7月7日
    23
  • 利用Openssl生成证书

    利用Openssl生成证书生成privatekeyopensslgenrsa-des3-outca.key2048生成根证书opensslreq-new-x509-sha384-days3650-keyca.key-outca.crt生成二级证书的privatekeyopensslgenrsa-outsecond.key2048生成二级证书的CSRopensslreq-new-keysecond.key-outsecond.csropen.

    2026年1月22日
    5
  • Linux 系统 top 命令详解

    Linux 系统 top 命令详解文章目录前言top命令关键词详解1.VIRT:virtualmemoryusage虚拟内存2.RES:residentmemoryusage常驻内存3.SHR:sharedmemory共享内存4.DATA:数据占用的内存5.top运行中的交互命令top命令图解前言top命令是Linux下常用的性能分析工具,能够实时显示系统状况,比如cpu、内存的使用等。以下详细介绍top命令。top命令关键词详解1.VIRT:virtualmemoryusa

    2025年11月28日
    7
  • boost之timer

    1.timer类实现2.重点说明2.1CLOCKS_PER_SECtimer的计数使用了标准头文件<ctime>里的clock()函数,它返回自进程启动以来的clock计数,每

    2021年12月28日
    43
  • Navicat 15.0.23激活码[在线序列号][通俗易懂]

    Navicat 15.0.23激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    144

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号