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 Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1