第32章emWin(ucgui)窗口管理器之回调机制
- 格式:pdf
- 大小:312.29 KB
- 文档页数:6
【第3版emWin教程】第44章emWin6.x窗⼝管理器官⽅实例简单讲解第44章 emWin6.x窗⼝管理器官⽅实例简单讲解为了帮助⼤家更好的理解窗⼝管理器的回调和消息机制,官⽅也提供了好⼏个这⽅⾯的例⼦,本章节我们将官⽅这⼏个例⼦也跟⼤家进⾏简单讲解,进⼀步帮助⼤家更好的学习窗⼝管理器。
44.1 初学者重要提⽰44.2 官⽅WM_Redraw.c实例讲解44.3 官⽅WM_Sample.c实例讲解(含⼤量窗⼝API操作)44.4 官⽅WM_LateClipping.c实例讲解44.5 官⽅WM_Video.c实例讲解44.6 总结44.1 初学者重要提⽰1、通过实例来学习emWin是最佳的学习捷径。
2、本章节讲解的例⼦中⽤到的部分功能还没有讲解到,但是不影响⼤家学习窗⼝管理器相关的知识。
没有讲解到的知识基本都会在后⾯章节中跟⼤家讲解。
3、窗⼝管理器这块的API函数应该是emWin⼿册所有章节中函数最多的,以后需要⽤到什么功能了,查询就⾏,或者看官⽅的实例,哪个函数不理解了也可以查⼿册。
下图是中⽂版⼿册⾥⾯API函数位置:下图是英⽂版⼿册⾥⾯API函数的位置:44.2 官⽅WM_Redraw.c实例讲解这个DEMO在模拟器中的位置:主要功能介绍:这个例⼦与第43章43.3⼩节中的例⼦相似,分别演⽰桌⾯窗⼝配置了重绘操作和不配置重绘操作下,移动窗⼝的效果。
其实不光在桌⾯窗⼝上⾯移动窗⼝要重绘,其它创建的窗⼝上⾯移动是⼀样的,也需要设置重绘。
如果⽤户新窗⼝的窗⼝回调函数⾥⾯没有写重绘消息WM_PAINT,窗⼝管理器就会按照系统默认的颜⾊的进⾏重绘,如果⽤户写了WM_PAINT消息就会按照⽤户设置的进⾏重绘。
下⾯我们将这个代码分析⼀下:#include "GUI.h"#include "WM.h"/*********************************************************************** Defines************************************************************************///// Recommended memory to run the sample with adequate performance//#define RECOMMENDED_MEMORY (1024L * 5)/********************************************************************* static code**********************************************************************//********************************************************************* _cbBkWindow*/static void _cbBkWindow(WM_MESSAGE* pMsg) { //--------------(1)switch (pMsg->MsgId) {case WM_PAINT:GUI_ClearRect(0, 50, 319, 239); //--------------(2)default:WM_DefaultProc(pMsg);}}/********************************************************************* _cbWindow*/static void _cbWindow(WM_MESSAGE* pMsg) { //--------------(3)GUI_RECT Rect;switch (pMsg->MsgId) {case WM_PAINT:WM_GetInsideRect(&Rect); //--------------(4)GUI_SetBkColor(GUI_RED);GUI_SetColor(GUI_YELLOW);GUI_ClearRectEx(&Rect); //--------------(5)GUI_DrawRectEx(&Rect);GUI_SetColor(GUI_BLACK);GUI_SetFont(&GUI_Font8x16);GUI_DispStringHCenterAt("Foreground window", 75, 40);break;default:WM_DefaultProc(pMsg);}}/********************************************************************* _MoveWindow*/static void _MoveWindow(const char* pText) {WM_HWIN hWnd;int i;//// Create foreground window//hWnd = WM_CreateWindow(10, 50, 150, 100, WM_CF_SHOW, _cbWindow, 0); //--------------(6) GUI_Delay(500);//// Move foreground window//for (i = 0; i < 40; i++) {WM_MoveWindow(hWnd, 2, 2); //--------------(7)GUI_Delay(10);}//// Show text before deleting window if we have one//if (pText) {GUI_DispStringAt(pText, 5, 50);GUI_Delay(2500);}//// Delete foreground window//WM_DeleteWindow(hWnd); //--------------(8)WM_Invalidate(WM_HBKWIN); //--------------(9)GUI_Exec();}/********************************************************************* _DemoRedraw*/static void _DemoRedraw(void) {WM_CALLBACK * _cbOldBk;GUI_SetBkColor(GUI_BLACK);GUI_Clear();GUI_SetColor(GUI_WHITE);GUI_SetFont(&GUI_Font24_ASCII);GUI_DispStringHCenterAt("WM_Redraw - Sample", 160, 5);GUI_SetFont(&GUI_Font8x16);while(1) {//// Move a window over background//_MoveWindow("Background has not been redrawn"); //--------------(10)//// Clear background//GUI_ClearRect(0, 50, 319, 239);GUI_Delay(1000);//// Set callback for background window//_cbOldBk = WM_SetCallback(WM_HBKWIN, _cbBkWindow); //--------------(11)//// Move a window over background//_MoveWindow("Background has been redrawn");//// Delete callback for Background window//WM_SetCallback(WM_HBKWIN, _cbOldBk); //--------------(12)}}/*********************************************************************** Public code************************************************************************//*********************************************************************** MainTask*/void MainTask(void) {GUI_Init();//// Check if recommended memory for the sample is available//if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {GUI_ErrorOut("Not enough memory available.");return;}_DemoRedraw();}1. 桌⾯窗⼝回调函数。
第1章e m W i n介绍本期教程开始带领大家了解一下STemWin的基本知识,其实确切的讲应该叫emWin基础知识,由于教程使用的开发板是ST的微控制器,所以就把名字统一命名成STemWin(为什么叫STemWin,在下面会有详细的讲解)。
1.1 STemWin,emWin,μCGUI之间的关系1.2 SEGGER公司介绍1.3 STemWin介绍1.4 STM32F103和407跑STemWin性能测试1.5 STemWin论坛1.6 总结1.1S T e m W i n,e m W i n,μC G U I之间的关系这个放在最开头进行说明,因为很多的初学者比较的迷惑。
对于一些刚学GUI的用户来说,知道μCGUI的比较多,而不知道所谓的emWin或者STemWin。
这个并不奇怪,主要是因为大部分人只知道SEGGER公司的做的JLINK,而不知道他们还有RTOS和相关的中间件(中间件的意思就是基于RTOS的文件系统,GUI,USB主机和设备协议栈等)。
1.1.1μCGUI在国内比较火的原因μCGUI在国内前几年比较火的原因有三点:●一个是μCOS-II在国内的推广,自从Micrum公司出的那本《嵌入式实时操作系统μCOS-II》发布之后,国内关于μCOS-II的资料就是普天盖起,再加上各种培训机构和开发板的推广,μCOS-II就在国内火起来了。
μCOS-II火的同时,它配套的中间件,特别是μCGUI就跟着在国内火了起来。
●前几年国内有一个μCGUI的论坛,这个论坛在国内的μCGUI方面应该算是做得最好的,特别是那个站长在μCGUI方面的研究,这位站长对于μCGUI在国内的发展功不可没。
●还有一个原因就是μCGUI是带有源码的,很多时候可以通过修改部分的源码实现一些特殊的功能,现在网上流传的μCGUI的源码已经不知道经过多少人的手被修改过,最原始的的代码已经在官网上面找不到了。
1.1.2emWin和μCGUI的关系首先要明白,这两个GUI是一个东西。
emwin消息机制
emWin的消息机制是其核心部分,负责处理所有在触控界面上的操作。
例如,当用户触摸一个按钮、滚动条或编辑框等控件时,都会触发窗口管理器去处理这些消息。
处理完消息后,会跳转到窗口回调函数的相应部分,在这些部分中添加所需的功能。
emWin的窗体管理基本框架也是基于窗体消息处理机制,即对窗体内的事务处理都是将各个事件作为窗体消息来响应执行。
例如,当程序首次启动或者窗口被移动时,系统就会触发WM_PAINT消息以重绘页面。
emWin的消息机制不仅包括了消息结构与类型的概念,还涉及到窗口回调机制的应用。
通过这样的机制,可以高效地处理各种用户交互事件,并实现相应的功能。
uCGUI(emWin)的应用与移植uC/GUI(emWin)的应用与移植 2006-11-19 01:38当你开始使用emWin进行编程时,通常遵循以下的步骤:第1步:配置emWin第一步通常是通过修改头文件LCDConf.h来配置emWin。
LCDConf.h中的宏定义描述了LCD显示部分硬件特性;根据你的具体情况修改这些宏定义(例如显示屏的长、宽,每像素点用几位表示,LCD控制器的类型等参数)。
第2步:定义LCD的底层驱动函数底层函数包括对LCD(控制器)的初始化函数,LCD显示缓冲区的读写函数等,完成对LCD显示硬件的直接操作。
对于映射在系统存储器上的LCD,对显示缓冲区的操作仅需要在LCDConf.h中进行定义就可以了。
但对于采用I/O端口/缓冲区操作的LCD,就必须定义相应的接口函数了。
第3步:编译,链接和测试例子代码emWin对于单任务和多任务环境下的应用都提供了例子代码。
在编程之前,对这些例子代码进行编译、链接和测试,使你能够初步了解这些代码的使用。
第4步:修改例子程序对例子代码作少量的修改。
逐步添加一些额外的指令,例如显示不同大小的文字,显示多行等等,从而进一步理解代码的应用。
第5步:emWin的多任务应用,加入到你的操作系统中如果你的系统有可能多个任务同时对显示进行操作,这时就要用到GUITask.C文件中的GUI_MAXTASK和GUI_OS宏。
第6步:采用emWin编写你自己的应用到这一步你应该对怎样使用emWin有一个清楚的了解了。
考虑如何采用emWin提供的函数来构建你的应用,并通过阅读手册来获得各函数更详细的功能和使用上的信息。
emWin的移植移植是指对emWin进行配置和修改,使它能够在你的目标系统上运行。
参考第3.4节中的第一步和第二步,移植工作主要是针对配置头文件中的宏定义进行修改。
这些宏包括:1. LCD宏,定义了显示的尺寸和一些可选择的特性(例如镜像,等等)2.LCD控制器宏,定义了怎样对控制器进行操作。
emWin 5.22 (uCGUI) 图形用户接口移植实例——STM32作者:Ach日期:2013年12月29日联系方式:ox000008@1.概要移植图形用户接口的好处是不言而喻的。
本文图文并茂地介绍了一个emWin 5.22(uCGUI)的移植实例。
文章具体分为emWin简介,硬件平台简介,开发环境及项目简介,移植过程以及总结几个部分。
2.emWin简介emWin是一种高效的而图形用户界面,是我们能够摆脱处理器和显示控制器而更专注于GUI的设计。
这里借用STemWin的一幅图来说明emWin的作用和结构。
它通过LCD及GUI的配置来驱动底层硬件,而应用程序又是通过调用emWin来实现各种GUI。
5.22版的emWin带有许多常用的显示控制器的驱动(在参考手册Display Driver一章中有详细介绍),因此为我们移植带来了诸多方便。
emWin的更详细的内容可参照它的参考手册。
图1. emWin在项目中的结构3.硬件平台简介笔者使用的是一块以STM32F103VET6为核心的ARM开发板,没有外部的SRAM及Flash。
显示屏为2.8”320*240的彩色液晶屏,屏的驱动芯片为ILI9341(emWin 5.22带有它的驱动)。
屏与CPU 的连接方式为该ARM核心所特有的FSMC_SRAM方式,访问LCD内容时操作就如同读写SRAM一样方便。
如果你想使用其它硬件平台来移植emWin,本文亦有一定的参考价值。
希望本文能助你成功移植emWin。
图2. 硬件平台4.开发环境简介笔者所使用的开发软件为MDK-ARM 4.70。
项目模板使用的是STemWin库中的(可从ST官方下载)。
图3. 项目截图如图,项目下面有3个文件夹,其中Appli存放的是应用层的程序,第二个文件夹就如文件名,存放了emWin5.22所有部件,第三个文件夹存放了一些STM32及其它的库。
具体见附件。
5.移植过程有了MDK-ARM以及STemWin库,整个移植过程应该比较简单。
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的中文手册。
第34章窗口管理器实例(一)为了帮助大家更好的理解窗口管理器的回调和消息机制,本期教程专门做了三个相关的例子,帮助大家更好的理解。
34. 1 用户自定义消息类型实例34. 2 桌面窗口回调函数实例34. 3 官方WM_Redraw.c实例34. 4 总结34.1用户自定义消息类型实例这里用上期教程所介绍的自定义消息类型做一个实例。
代码跟上期教程的三个实例类似。
实现源码如下(可以直接将代码复制到模拟器或者开发板上面运行)。
#include <stddef.h>#include "GUI.h"#include "DIALOG.h"#include "WM.h"#include "BUTTON.h"#include "CHECKBOX.h"#include "DROPDOWN.h"#include "EDIT.h"#include "FRAMEWIN.h"#include "LISTBOX.h"#include "MULTIEDIT.h"#include "RADIO.h"#include "SLIDER.h"#include "TEXT.h"#include "PROGBAR.h"#include "SCROLLBAR.h"#include "LISTVIEW.h"#define WM_UPDATE WM_USER + 1(1)/*********************************************************************** static data************************************************************************/GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};static char ucBackColor;/*********************************************************************** Dialog resource** This table conatins the info required to create the dialog.* It has been created by ucGUIbuilder.*/static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {{ FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 800,480,FRAMEWIN_CF_MOVEABLE,0}, { BUTTON_CreateIndirect, "BUTTON0", GUI_ID_BUTTON0, 82, 122,162,37, 0,0},{ BUTTON_CreateIndirect, "BUTTON1", GUI_ID_BUTTON1, 357,123,152,35, 0,0}};/******************************************************************* FunctionName:void PaintDialog(WM_MESSAGE * pMsg)** Function: to initialize the Dialog items**** call this function in _cbCallback --> WM_PAINT*****************************************************************/void PaintDialog(WM_MESSAGE * pMsg){WM_HWIN hWin = pMsg->hWin;GUI_SetBkColor(_acColor[ucBackColor]);GUI_Clear();}/******************************************************************* FunctionName:void InitDialog(WM_MESSAGE * pMsg)** Function: to initialize the Dialog items**** call this function in _cbCallback --> WM_INIT_DIALOG*****************************************************************/void InitDialog(WM_MESSAGE * pMsg){WM_HWIN hWin = pMsg->hWin;////FRAMEWIN//FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);FRAMEWIN_SetTitleHeight(hWin,30);/* 默认颜色取*/ucBackColor = 0;}/*********************************************************************** Dialog callback routine*/static void _cbCallback(WM_MESSAGE * pMsg){int NCode, Id;WM_HWIN hWin = pMsg->hWin;switch (pMsg->MsgId){case WM_UPDATE: (2)ucBackColor++;if (ucBackColor == 3){ucBackColor = 0;}WM_InvalidateWindow(hWin);break;case WM_MOUSEOVER:break;case WM_PAINT:PaintDialog(pMsg);break;case WM_INIT_DIALOG:InitDialog(pMsg);break;case WM_KEY:switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {case GUI_KEY_ESCAPE:GUI_EndDialog(hWin, 1);break;case GUI_KEY_ENTER:GUI_EndDialog(hWin, 0);break;}break;case WM_NOTIFY_PARENT:Id = WM_GetId(pMsg->hWinSrc);NCode = pMsg->Data.v;switch (Id){case GUI_ID_OK:if(NCode==WM_NOTIFICATION_RELEASED)GUI_EndDialog(hWin, 0);break;case GUI_ID_CANCEL:if(NCode==WM_NOTIFICATION_RELEASED)GUI_EndDialog(hWin, 0);break;case GUI_ID_BUTTON0:switch(NCode){case WM_NOTIFICATION_CLICKED:ucBackColor++;if (ucBackColor == 3){ucBackColor = 0;}WM_InvalidateWindow(hWin); break;case WM_NOTIFICATION_RELEASED:break;case WM_NOTIFICATION_MOVED_OUT:break;}break;case GUI_ID_BUTTON1:switch(NCode){case WM_NOTIFICATION_CLICKED:ucBackColor--;if (ucBackColor < 0){ucBackColor = 2;}WM_InvalidateWindow(hWin);break;case WM_NOTIFICATION_RELEASED:break;case WM_NOTIFICATION_MOVED_OUT:break;}break;}break;default:WM_DefaultProc(pMsg);}}/*********************************************************************** MainTask************************************************************************/void MainTask(void){WM_HWIN hDlg;GUI_Init();WM_SetDesktopColor(GUI_BLUE); /* Automacally update desktop window */WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */ PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);/* 创建一个对话框 */hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);while (1){WM_SendMessageNoPara(WM_GetClientWindow(hDlg), WM_UPDATE); (3)GUI_Delay(500);}}1.定义一个用户消息WM_UPDATE。
emwin源码解析【最新版】目录1.引言2.emwin 的特点与简介3.emwin 源码结构分析4.emwin 主要功能模块解析5.emwin 的性能优化策略6.总结正文【引言】emwin 是一款基于 Linux 内核的嵌入式图形窗口系统,具有轻量级、高性能、可扩展性强等特点,广泛应用于各类嵌入式设备。
本文将对 emwin 的源码进行解析,以深入了解其架构和实现原理。
【emwin 的特点与简介】emwin 具有以下特点:1.轻量级:emwin 的体积较小,占用资源较少,适合嵌入式设备的硬件环境。
2.高性能:emwin 基于 Linux 内核进行开发,充分利用了硬件加速功能,提供了高性能的图形渲染能力。
3.可扩展性强:emwin 提供了丰富的 API 接口,方便开发者进行二次开发和定制。
【emwin 源码结构分析】emwin 的源码结构分为以下几个部分:1.核心模块:包括窗口管理、绘图、输入事件处理等核心功能实现。
2.驱动模块:提供了针对不同硬件平台的显示驱动,如 LCD、触摸屏等。
3.工具模块:提供了 emwin 的配置工具、调试工具等。
4.示例模块:提供了一些示例程序,方便用户快速上手和进行开发。
【emwin 主要功能模块解析】1.窗口管理:emwin 的窗口管理模块采用了层叠式窗口管理,支持多窗口、多任务的操作。
2.绘图:emwin 的绘图模块提供了基本的绘图功能,如绘制线条、矩形、多边形等,以及复合图元、图层管理等功能。
3.输入事件处理:emwin 的输入事件处理模块支持鼠标、键盘等输入设备,并提供了事件过滤和处理机制。
【emwin 的性能优化策略】emwin 在实现高性能的过程中,采用了以下策略:1.充分利用硬件加速:emwin 基于 Linux 内核进行开发,利用了硬件加速功能,提高了图形渲染性能。
2.优化数据结构和算法:emwin 在实现各类功能时,采用了高效的数据结构和算法,降低了 CPU 和内存的开销。
1 UCGUI 窗体管理及消息处理机制分析----多对话框/模态窗体/透明窗体支持分析作者:ucgui日期: 2005-09-08[v1.0.0.0 2005-06-30完成]来源: 版本: v1.0.0.1问题的提出:[求助]关于对话框处理程序中,想在OK 按钮按下后想弹出一个消息框,该怎么做?直接加在程序中好像不行,如何让消息框弹出后成为模态窗体呢?请版主帮帮忙。
[解析]在UCGUI 中,对话框只支持单个对话框窗体,不支持多个独立的对话框,现在我们从其源码来分析一下它为什么支持单个对话框窗体以及如何改进它以支持多个独立对话框,要讲解这个问题我们必须首先理解UCGUI 中的窗体消息LOOP ,没有消息LOOP 窗体就是死水一潭,不能接受任何外界的输入,只是一个画在那里的图画而已。
[声明]本文中提到的源码均为UCGUI3.24版源码,新版UCGUI 源码会有改动,请下载本文示例代码来结合阅读本文。
摘要: 本文主要介绍了UCGUI 中的对话框的消息处理机制,并指出在现有UCGUI 上如何增加多窗体支持,并在分析解决问题时着重介绍了其输入设备消息WM_TOUTCH 及WM_KEY 两类消息处理方法,并同时初步指出一种在UCGUI 中实现模2 态对话框以及透明窗体的原理说明,不还有窗体重画消息WM_PAINT 消息处理原理。
一、各种基本消息介绍及处理流程----对话框内部消息流转及外部消息LOOP 分析.UCGUI 是采用的消息驱动的,它专门有对外的一套收集消息的接口, 我在模似器中, 就是通过LCD 模拟显示屏窗口的MOUSE 消息,将MOUSE 消息传入到这个接口中, 以驱动UCGUI 中的窗体的。
UCGUI 中的消息驱动其实与WINDOWS 的是类似的,几种基本的消息与WINDOWS 是一样的,但UCGUI 的更简单且消息更少,对于一些消息的处理得也很简化,没有WINDOWS 那么多的消息种类及复杂处理。