uC_GUI 窗体管理及消息处理机制分析

合集下载

GUI的种类及uCGUI的架构

GUI的种类及uCGUI的架构

GUI的种类及uCGUI的架构(说明:本博文转载自他人笔下,希望可以帮助同僚更深刻的认识GUI)GUI的种类及uC/GUI的架构一. GUI概述GUI(Graphic User Interface)是图形化的用户界面,它能提供友好的人机交互接口。

它有以下特性:体积小,运行时耗用系统资源少,层次化的结构,易移植,可靠性高嵌入式GUI种类嵌入式GUI种类有很多,下面列举几种:1. WINCE的GWES(图形、窗口、事件子系统),由应用程序接口(API)、用户接口(UI)和图形设备接口(GDI)组成,包含了消息机制2. Trolltech公司的产品:QT、QTE、QTOPIA,它们跨平台、功能强大,但资源消耗多3.MINIGUI是魏永明创建的嵌入式GUI中间件,可以以多线程、多进程、以及单任务运行,是比较成熟的商用系统4.ucGUI能支持多种环境的GUI,可以以多任务形式运行或者以前后台模式运行。

商用化,但功能相对简单GUI的两种模式:1. Windows模式,采用类似windows的API和相应的消息机制,如ucGUI、MicroWindows、miniGUI2.C/S模式,采用一个XServer,所有的显示都以客户端的形式请求服务,如Nano-XGUI在嵌入式系统或实时系统中的地位越来越多的市场需求数据显示,包括PDA、娱乐消费电子、机顶盒、DVD等影音设备、WAP 手机等高端电子产品得到广泛应用,原先仅在军工、工业控制等领域中使用的GUI图形系统,受到越来越多的关注。

对于轻量级 GUI 的系统而言,对 GUI 的要求相对较低,如传统51类型单片机这类系统一般不希望建立在庞大累赘的、非常消耗系统资源的操作系统和 GUI 之上,如 Windows 或 X Window。

目前此类系统都直接使用原有编程手段,采用比较简单的手法实现GUI。

对于太过庞大和臃肿的GUI系统而言,μc/GUI这类可运用于此类资源较紧张的轻型 GUI 的需求更加突出uc/GUI简介μc/GUI是美国Micrium公司出品的一款针对嵌入式系统的优秀图形软件。

UCGUI中的实现透明窗体的原理

UCGUI中的实现透明窗体的原理

UCGUI中的实现透明窗体的原理作者:UCGUI邮箱:UCGUI@主页:时间:2006-12-18版本: v1.0.0.0摘要:有很多朋友不太明白UCGUI中如何实现透明窗体,虽然有些朋友曾经讨论过UCGUI 中透明窗体的实现,但涉及到对UCGUI核心结构的改动, 本文深入解析UCGUI的透明窗体的支持原理,从剪切处理以及重绘方面全面讲解透明窗体的支持要点,并着手修改UCGUI以达到半透明窗体的效果,并不改动UCGUI的上层源码,而仅仅将修改局限于底层的LCD图形驱动当中,无须更改UCGUI本身。

目录一. 透明处理的本质.二. UCGUI中透明窗体支持.三. MemDev下实现透明窗体的问题.四. 透明窗体是否仅绘图时进行透明处理即可?五. 修改后的代码下载.一. 透明处理的本质。

1.透明显示的原理.假设一张图片A与B,如果B是透明的,其意即,透明B可以看到A,但并不是完全看到A,只是看到A的朦胧的影象。

在图形处理上,其实就是在A上面再显示B的时候,对B上面的每个点的颜色做了处理,简单的说就是与A的颜色按比例进行了一个混合,混合的时候是按照R、G、G分别进行混合的.2.透明显示的计算公式alpha是透明度,亦即显示B时B的每个象素点与A的相同位置的象素点进行混合的比例系数,R(b)_new/G(b)_new/B(b)_new为计算所得的新的B要显示的象素点的R/G/B颜色分量,R(b)/G(b)/B(b)为B本来象素点要显示的象素点的R/G/B颜色分量,R(a)/G(a)/B(a)为A的点的R/G/B颜色分量.R(b)_new = R(b)*(1-alpha) + R(a)*alpha;G(b)_new = G(b)*(1-alpha) + G(a)*alpha;B(b)_new = B(b)*(1-alpha) + B(a)*alpha;3.实现窗体透明显示面临的问题经过这样合成之后,就可以获得B透明显示于A,即可以看到A又可以看到B的效果。

嵌入式用户图形接口uCGUI在uCOSII上的嵌入

嵌入式用户图形接口uCGUI在uCOSII上的嵌入

嵌入式用户图形接口uC/GUI在uC/OSII上的嵌入4.1 uC/GUI简介uC/GUI是Micrium公司开发的通用的嵌入式用户图形界面软件。

它给任何使用图形LCD的应用程序提供独立于处理器和LCD控制器之外的有效的图形用户接口。

可以应用于单一任务环境,也可以应用于多任务环境中。

uC/GUI能够应用于任何LCD控制器和CPU的任何尺寸的物理显示或者模拟显示中。

uC/GUI的特点如下:◆适用于任何8位/16位/32位CPU,可允许于支持ANSI C的任何编译器◆适用于任何控制器驱动任何LCD(单色,灰度,或者彩色)◆通过配置宏,可支持任何接口◆可配置显示尺寸◆可在LCD的任何一点上显示字符和画位图◆对于显示尺寸和速度提供优化进程,编译时间依赖于采用的优化进程◆支持虚拟显示,虚拟显示的尺寸比实际显示大。

4.2 uC/GUI文件组织uC/GUI目录下的文件有配置文件目录Config,GUI库函数目录,以及为GUI 编写的应用程序目录。

下面分别简要介绍相应目录下的函数,更为详细的文件介绍请参考我的uC/GUI移植的源代码。

◆ uC/GUI\Config\目录:GUICONF.h:配置GUI移植到不同操作系统的选项。

在本论文中配置移植到uC/OSII中,允许多任务调用uC/GUI函数。

GUITouchConf.h:配置触摸屏的选项以及编写触摸屏的驱动。

本文移植uC/GUI所使用的LCD屏不支持触摸屏,所以此文件为空。

LCD_Init.C: LCD控制器的初始化文件。

LCD_Conf.h: LCD显示屏的选项文件,包括bpp,调试板模式,水平、竖直方向的分辨率等等。

◆ uC/GUI\GUI\AntiAlias\目录:这个目录中包含9个文件,处理显示的边缘模糊效果,也就是抗锯齿和优化LCD锯齿。

液晶屏上画斜线往往都有锯齿,所以通过优化算法进行美化。

◆ uC/GUI\GUI\ConvertColor\目录:这个目录中包含14个.C文件,涉及调色板模式。

C语言GUI编程形界面库和事件处理

C语言GUI编程形界面库和事件处理

C语言GUI编程形界面库和事件处理C语言是一种广泛应用于嵌入式系统和系统级编程的高级编程语言。

虽然C语言本身不提供图形用户界面(GUI)编程的支持,但通过使用相应的GUI库和事件处理机制,我们仍然可以在C语言中实现功能强大的GUI应用程序。

一、GUI编程概述GUI编程是指利用图形用户界面(Graphical User Interface)来设计和构建软件应用程序的过程。

与传统的命令行界面(Command Line Interface)相比,GUI界面更加直观、友好,可以通过按钮、菜单、文本框等元素来呈现和操作软件的功能。

二、常用的C语言GUI库1. GTK+GTK+(GIMP Toolkit)是一套开源的GUI库,最初是为图像处理软件GIMP开发而来,目前已经广泛应用于Linux和Unix等操作系统。

GTK+基于面向对象的编程模式,提供了丰富的控件和功能,具有良好的跨平台性能。

2. QtQt是一套跨平台的GUI开发框架,也是C++开发工具箱。

虽然Qt主要面向C++开发者,但也提供了Qt for Python等其他语言的绑定。

Qt具有良好的可定制性和丰富的控件库,支持多种操作系统和设备。

3. WinAPIWinAPI(Windows API)是微软Windows操作系统提供的一套API 接口,用于程序开发和系统调用。

通过使用WinAPI,我们可以在C语言中实现Windows平台的GUI应用程序。

然而,WinAPI的使用相对复杂,需要进行大量的调用和处理。

三、事件处理机制在GUI编程中,事件是用户与程序交互的基本方式。

用户的操作,如鼠标点击、按键输入等,都会触发相应的事件,程序需要通过事件处理机制来响应这些事件并执行相应的操作。

1. 事件循环事件循环是一个主循环,负责监听和分发事件。

程序在运行时,会不断地等待用户操作产生的事件,并根据事件类型调用对应的事件处理函数。

2. 事件处理函数事件处理函数是程序响应事件的具体逻辑。

uCGUI使用

uCGUI使用

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的中⽂⼿册。

第32章emWin(ucgui)窗口管理器之回调机制

第32章emWin(ucgui)窗口管理器之回调机制

第6页 共6页
32.2.6 自动使用存储设备
窗口管理器的默认特性是向每个需要重绘的窗口发送一条 WM_PAINT。这会导致闪变效应。为抑制这 些每个窗口的闪变效应,可为重绘操作自动使用存储设备。方法为,在创建窗口时设置标记 WM_CF_MEMDEV 、 使 用 函 数 WM_SetCreateFlags() 设 置 默 认 创 建 标 记 , 或 使 用 函 数 WM_EnableMemdev()。WM 然后会将 WM_PAINT 消息输出重定向到存储设备中,再复制到显示器中。 如果整个窗口的内存不够,会自动使用分段。存储设备只是临时使用,在绘制操作完成后会移除。
裁剪是将输出限制为一个窗口或窗口一部分的过程。 窗口的裁剪区域是其可见区域。它是窗口区域减去被更高 Z 轴阶层的同属窗口遮挡的区域,然后减去 没有放入父窗口可见区域的任何部分。 坐标 坐标通常是 2 维坐标,以像素单位表示。坐标由 2 个值组成。第一个值指定水平分量 (也称为 x 坐 标),第二个值指定垂直分量 (也称为 y 坐标)。 桌面坐标 桌面坐标是桌面窗口的坐标。显示器的左上角位置 (原点)为(0,0)。 桌面窗口 桌面窗口由窗口管理器自动创建,并且始终覆盖整个显示区域。它始终是最底层的窗口,在没有定义 其他窗口时,它是默认 (活动)窗口。所有窗口都是桌面窗口的后代窗口 (子窗口、孙窗口等)。 句柄 创建新窗口后,WM 会分配一个称为句柄的唯一标识符。句柄用于在该特定窗口中执行的其他任何操 作。 隐藏/显示窗口 隐藏的窗口不可见,尽管仍然存在 (有一个句柄)。创建窗口时,如果不指定创建标记,默认情况下 是隐藏的。显示窗口使其可见,隐藏窗口则使其不可见。 父坐标 父坐标是与父窗口相关的窗口坐标。窗口的左上角位置 (原点)为(0,0)。 透明性 具有透明区域的窗口包含不与窗口其余部分一起重绘的区域。这些区域就象其背后窗口“透过”它们 显示一样。在此情况下,在有透明区域的窗口之前重绘背后窗口非常重要。WM 自动按正确的顺序进行重 绘。 有效化/无效化 有效窗口是不需要重绘的完全更新窗口。 无效窗口不会反映所有更新,因此需要完全或部分重绘。作出的更改影响了特定窗口时,WM 将该窗 口标记为无效。下次窗口重绘时 (手动或通过回调例程),将进行验证。 窗口坐标 窗口坐标是窗口的坐标。窗口的左上角位置 (原点)为(0,0)。 Z 位置, 底部/顶部

ucgui gui_lock()原理

ucgui gui_lock()原理

ucgui gui_lock()原理ucgui 并不是我所熟知的某个特定的GUI库,可能是某个特定环境或定制版本中的GUI库。

不过,基于一般的GUI库设计原理,gui_lock() 函数通常用于锁定GUI系统,防止在关键操作期间发生意外的界面更新或重绘。

以下是关于 gui_lock() 函数可能的工作原理的一般性描述:工作原理:1.状态管理:gui_lock() 函数会更改GUI库的内部状态,将GUI系统标记为锁定状态。

这通常通过设置一个标志位或计数器来实现。

2.阻止重绘:当GUI系统处于锁定状态时,任何尝试更新或重绘界面的操作都会被阻止或延迟。

这确保了在锁定期间,界面不会发生变化,从而避免了可能的界面闪烁或错误显示。

3.同步和异步操作:在某些情况下,GUI操作可能是异步的,即它们会在后台线程或定时任务中执行。

gui_lock() 需要确保即使在这些异步操作中,锁定状态也能被正确识别和处理。

4.嵌套锁定:有些GUI库支持嵌套锁定,即多次调用 gui_lock() 会增加锁定计数,而只有对应的 gui_unlock() 调用次数足够多时,GUI系统才会真正解锁。

这可以防止由于误操作导致的锁定和解锁不匹配问题。

5.解锁操作:通常会有一个与 gui_lock() 对应的 gui_unlock() 函数,用于解除锁定状态。

当GUI系统解锁时,之前被阻止的界面更新操作可以继续执行。

示例伪代码:c复制代码// 假设有一个全局变量来表示GUI的锁定状态int gui_locked = 0;void gui_lock() {gui_locked++;// 可能还有其他操作,如禁用定时器或事件处理等}void gui_unlock() {if (gui_locked > 0) {gui_locked--;// 如果解锁完成,恢复定时器或事件处理if (gui_locked == 0) {// 触发界面更新或重绘}}}注意事项:•谨慎使用:锁定GUI系统应该谨慎使用,因为它会阻止界面的正常更新。

UCGUI 简介

UCGUI 简介

UCGUI 简介译者:UCGUI邮箱:UCGUI@主页:版本:v1.0.0.01.0......UCGUI整体简介................UCGUI简介................本文档的目的...... .........前提学习要求.1.1.....要求...............目标硬件系统................开发环境(编译器).1.2.....UCGUI特性....... ........示例.1.3.....评估板.1.4.....如何使用本手册................印刷上的字体说明.1.5.....屏幕及坐标系统.1.6.....LCD控制器的连接类型.1.7.....数据类型.UCGUIUCGUI是一种嵌入式应用中的图形支持系统.它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示.它的设计架构是模块化的, 由不同的模块中的不同层组成, 由一个LCD驱动层来包含所有对LCD的具体图形操作, UCGUI可以在任何的CPU上运行, 因为它是100%的标准C 代码编写的.UCGUI能够适应大多数的使用黑白或彩色LCD的应用, 它提供非常好的允许处理灰度的颜色管理.还提供一个可扩展的2D图形库及占用极少RAM的窗口管理体系.本文档的目的本文档描述如何在嵌入式应用中安装,配制,使用UCGUI的图形用户接口, 并讲解UCGUI的内部设计架构.前提本文档假定你已经备坚实的C语言程序设计方面的知识, 如果你觉得自己这方面还不够, 那么我们推荐Kernighan 和 Richie的"C语言程序设计"给你, 它描述了最新的C标准, 即ANSI C标准, 本文档不须要具备汇编语言方面的知识.第一章1.1 要求对于开发UCGUI图形应用不须什么目标系统, 大部分的图形应用开发都可以在模拟器下进行; 但是最终的目的是通常还是在目标系统上运行程序.目标系统(硬件)你的目标系统必须具备如下几点:[1].CPU(8/16/32/64位)[2].必要的RAM和ROM存储[3].LCD显示器(任何类型及分辩率的)对于内存的需求取决于你选用的UCGUI的功能模块以及你所使用的目标系统上的编译器的效率. 内存的占用量无法估计准确的值, 下面就一些的数值适用于多数的目标系统.小型系统(不含窗口管理功能)[1].RAM:100字节[2].堆栈:500字节[3].ROM:10~25K(取决于选用的UCGUI功能模块)大型系统(包含窗口管理及各种窗体控件功能)[1].RAM: 2-6 kb (决于选用的应用中建立窗口的数量)[2].堆栈: 1200 bytes[3].ROM: 30-60 kb (决于选用的UCGUI功能模块)还要注意ROM的需求量随着你在应用程序中使用的字体数目而增长,以上的所有值都是粗糙的估计, 并不准确.开发环境(编译器)目标系统中采用的什么样的CPU并不重要, 但必须要有与所用CPU相对应的C编译器,如果你所使用的编译器有什么局限性, 请联系我们, 我们会告知你这些局限性会不会在你编译程序时产生问题, 大多数的16/32/64位的CPU或DSP上的编译器都可以正常使用, 大部分8位的编译也都可以正常编译.并不须要C++编译器, 不过它也可以正常使用, 如果有须求的话, 应用程序也可以在C++环境下正常编译使用.1.2 UCGUI的特性UCGUI的设计目标是为使用LCD作为图形显示装置的应用提供高效的/与LCD控制器独立及处理器独立的图形用户接口. 它适合于单任务环境及多任务环境, 如私用的操作系统或是商业的RTOS(实时操作系统). UCGUI以C源码形式提供, 并适用于任意LCD 控制器和CPU下任何尺寸的真实显示或虚拟显示.它包含以下特性:一般特性[1] 适用任何8/16/32位CPU, 只要有相对应的标准C编译器.[2] 任何的控制器的LCD显示器(单色,灰度,颜色), 只要有适合的LCD驱动可用.[3] 在小模式显示时无须LCD控制器.[4] 所有接口支持使用宏进行配制.[5] 显示尺寸可定制.[6] 字符和位图可在LCD显示器上的任意起点显示,并不仅局限于偶数对齐的地址起点.[7] 程序在大小和速度上都进行了优化.[8] 编译时允许进行不同的优化.[9] 对于缓慢一些的LCD控制器, LCD显存可以映射到内存当中, 从而减少访问次数到最小并达到更高的显示速度.[10]清晰的设计架构.[11]支持虚拟显示, 虚拟显示可以比实际尺寸大(即放大).图形库[1] 支持不同颜色深度的位图.[2] 提供可用的位图转换工具.[3] 图形运算时绝对不含浮点运算.[4] 快速画点/线(不含浮点运算).[5] 高速画圆及多边形.[6] 多种画图模式.字体集[1] 为基础应用提供多种不同字体:4*6, 6*8, 6*9,8*8, 8*9, 8*16, 8*17, 8*18, 24*32, 以及8, 10, 13, 16等几种高度(象素单位)的均衡字体(proportional fonts). 更详细的信息, 请参考第25章:"标准字体".[2] 可以方便的加入及链接进自定义字体.[3] 只有应用程序中用到的字体被实际链接进最后的执行映象文件中, 因此保证占用最小数量的ROM.[4] 提供可用的字体转换工具.任何宿主系统(如微软windows系统)上的可用字体均可以经转换后使用.字符串/数值输出[1] 支持数值的任何字体下的十进制/二进制/十六制显示.[2] 支持数值的任何字体下的十进制/二进制/十六制编辑输入.窗体管理器[1] 齐全的窗口管理, 包括剪切, 在窗体客户区外[2] 窗体可以移动及改变大小.[3] 支持窗口回调函数(可选功能).[4] 窗体占用最低RAM(每个窗体占用20个字节).可选的类似PC机的窗体控件[1] 可用的窗体控件(窗体对象, 也称作控件), 操作简便而且容易使用.触摸屏及鼠标支持[1]对于窗体控件如按钮, UCGUI提供触摸屏及鼠标支持.PC下的工具[1] 模拟器及查看器.[2] 位图转器工具.[3] 字体转换工具.示范样例为了给你一个更好的关于UCGUI可以完成什么的概念. 我们编写了不同的可用范例程序, 执行映象文件在Sample\exe下, 源码码在Sample目录下. Sample\GUIDemo下包含了展示更多UCGUI特性的范围范例程序.1.3 评估板一个完整的评估板包括有LCD显示器的演示板/C编译器/完整的工程示例, 评估板的目的主要是测试和演示UCGUI, 并可以熟悉UCGUI的开发.评估板[1] 三菱M30803 CPU/SED 13705 LCD 控制器(包含图表及文档说明).[2] LCD(320*240 分辨率)单色, 1/4 VGA彩色显示或者TFT.更详细的说明, 请查看网站.1.4 如何使用此文档本文档介绍了如何安装、配制、使用UCGUI, 并描述了UCGUI的内部设计架构以及所有提供的功能(即应用程序开发手册, 简称API接口).在实际使用UCGUI之前, 你应该阅读或者至少概览一遍整个手册以对UCGUI有一个整体的认识, 建议按照以下的步骤进行UCGUI的学习:[1] 获取UCGUI源码到硬盘中.[2] 通读本文档第二章:"UCGUI开篇".[3] 使用UCGUI模拟器以慢慢熟悉用它可以做什么(参考第三章:"UCGUI模拟器").[4] 使用文档其它部分提供的知识扩展你的程序.文档排版中使用符号标志的约定[参看具体的E文档]风格作用[1] 正文.[2][3] API参数.[4] 程序示例源码.[5] 已经加入存在的应用中的源码.1.5 屏幕及坐标体系屏幕由许多可以单独控制的点组成, 这些点称为象素, 大部分UCGUI提供的文本显示及画图函数均可以在任意指定的点进行画写.水平刻度为X轴, 垂直刻度为Y轴. 由X轴及Y轴坐标组成(x,y)二维坐标来描述屏幕中一点, 在需要X,Y坐标的作为参数的函数中X坐标在Y坐标之前传递. 屏幕(或者窗口)左上角点的坐标为(0,0). X轴右方向为正, Y轴下方向为正. 上图描述了UCGUI中的会标体系及X轴Y轴. 所有传入API参数中的坐标值的单位均为象素.1.6 LCD显示器到微控制器连接方式UCGUI提供所有LCD的访问支持, 实际上对几乎所有LCD控制器的都能提供独立透明的访问支持. 了解详细情况, 请参考第20章:"初级UCGUI配制". 如果你的LCD控制器不被支持的话请与我们联系, 我们目前正在为市场上所有的的LCD控制器编写驱动, 也许我们已经可以提供你打算使用的LCD控制器的驱动. 通常的为你应用写访问LCD的驱动是非常简单的工作. 如果在你目标硬件中需要的话, MIcrium公司可提供专业化的用户支持服务.LCD显示器控制器是以何种方式连接到系统中以及它是如何被程序访问的都不重要, 通常可以有几种连接方法, 在驱动程序中提供实现大部分的相同访问接口. 驱动程序通常情况下无须做什么大的修改, 可以在LCDConf.h文件中进行适合你的硬件的配制修改. 有关如何配制的情况可参考在第22章:"LCD 驱动程序"中的解释说明. 最通常的LCD 访问方法如下所描述, 如果你只想知道如何使用UCGUI, 以下小节可跳过.[1] LCD控制器总线型连接LCD控制器直接连接到系统总线上, 即意味着可以象RAM一样访问它, 这是一种非常高效的访问方法, 是强烈推荐使用的方法. LCD显存地址定义在LCDSEG当中, 为了能访问LCD显存, 必须知道LCD显存在物理空间中的映射区域, 这种连接方式的不同LCD控制器的驱动通用的.[2] LCD控制器端口型连接对于速度缓慢一些的控制器使用在快速的处理器上, 使用端口连接方式是唯一的解决方案. 这种连接方法的缺点是访问LCD的速度比总线型连接慢, 不过加上访问缓存后可以最大化的提高LCD的访问速度, 从而使LCD画面更新不会明显的下降. 编写驱动时所要做的就是写出设置及读写与LCD控制器连接的硬件端口的宏. 这种连接方式对于不同的LCD控制器需要不同的驱动程序.[3] 无须控制器的连接LCD显示器也可以不用LCD控制器而直接连接到系统上, LCD显示数据可以直接通过一个4位或是8位的移位寄存器来传送, 这种方式的硬件解决方案的优点是成本低, 但是缺点是占用大部分的处理器时间, 其占用率在不同的CPU上从20%到差不多100%不等; 对于速度慢的处理器, 这是根本不能接受的. 这种连接方式根本不须要指定的驱动程序, 因为UCGUI只是简单的将要显示的数据传送到LCD显存当中, 其余就是编写周期性的将LCD显存中的数据传送到LCD中显示的硬件图形显示相关部分.样例中提供了用C及优化过的M16C及M16C/80汇编语言编写的传送显存中数据到LCD中显示的代码.1.7 数据类型因为C并没有提供在不同的平台中固定长度的数据类型, 所以UCGUI定义了大部分自己的数据类型如下表所示:数据类型定义注解位有符号整数char 8-bitI8 signed无符号整数char 16-bitU8 unsignedI16 signed short 16-bit 有符号整数U16 unsigned short 16-bit 无符号整数I32 signed long 32-bit 有符号整数U32 unsigned long 32-bit 无符号整数I16P signed short 16-bit 有符号整数U16P unsigned short 16-bit 无符号整数对于多数16/32位的定义都可以非常方便的设置, 如果你在自己的应用程序部分定义改变或是重新定义自己的数据类型,推荐放在LCDConf.h配置文件内.。

gui基本原理

gui基本原理

gui基本原理GUI基本原理1. 什么是GUIGUI(Graphical User Interface),即图形用户界面,是一种人机交互界面,使用图形和图像来显示信息、实现操作。

与之相对应的是命令行界面(CLI),用户通过输入命令来操作。

2. GUI的基本组成GUI由以下几个基本组成部分构成:•窗口(Window):用户界面的基本单元,用于显示和接受用户操作。

窗口可以包含标题栏、菜单栏、工具栏、状态栏等。

•控件(Widget):窗口中的各种元素,用于展示信息和接受用户输入。

常见的控件有按钮、文本框、下拉框等。

•布局管理器(Layout Manager):用于控制窗口内控件的布局方式,如居中、靠左等。

•事件处理(Event Handling):用户的操作会触发相应的事件,通过事件处理机制,可以响应、处理这些事件,实现用户与应用程序的交互。

3. GUI的工作原理GUI的工作原理可以分为以下几个步骤:1.绘制窗口:首先,应用程序创建一个窗口对象,并通过操作系统调用,绘制窗口的基本框架和样式。

2.加载控件:界面设计师根据需求,在窗口中加载各种控件,设定控件的属性和样式。

3.事件循环:一旦窗口加载完成,应用程序就进入事件循环中。

在事件循环中,应用程序不断监听用户的操作,如鼠标点击、键盘输入等。

4.事件处理:当用户进行某种操作时,操作系统会根据操作类型生成相应的事件。

应用程序通过事件处理机制,捕获并处理这些事件,如执行相应的操作、更新窗口内容等。

5.刷新窗口:在事件处理过程中,应用程序可能需要更新窗口内容、样式等。

一旦更新完成,应用程序通过操作系统调用,将最新的窗口信息绘制出来。

6.循环更新:一旦窗口更新完成,应用程序再次进入事件循环,等待用户的下一次操作。

GUI的工作就是不断重复这个过程,实现用户与应用程序的交互。

4. GUI的优势和应用场景GUI相比于CLI具有以下优势:•直观性:通过图形和图像的展示,用户能够更直观地理解和操作应用程序。

uCGUI使用

uCGUI使用

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的中文手册。

安卓gui 原理

安卓gui 原理

安卓gui 原理
安卓GUI原理指的是安卓系统中的图形用户界面(GUI)的设计原理和实现机制。

安卓GUI采用嵌入式GUI系统的设计理念,遵循GWES(图形窗口事件系统)的一般规律,其基本原理包括以下几个方面:
1.事件管理:安卓GUI通过事件管理器收集系统消息,转换并分发系统消息
和用户消息给各个窗口对象,保证系统的实时性和响应用户输入。

2.窗口管理:安卓的窗口管理器负责管理窗口的建立、销毁、绘制以及活动
窗口的切换等。

它通过管理窗口的输入焦点,实现了多任务的处理和用户界面的动态切换。

3.GDI管理:安卓GUI中的GDI负责图形绘制,包括点、线、填充等基本图
形操作,以及图像操作如位传送、位图操作字体等。

4.系统体系构架及其数据流:安卓GUI设计的核心在于理解其系统体系构架
及数据流,这决定了GUI的输入和屏幕输出的基本流向,从而指导整体的设计和实现。

具体来说,例如,在安卓的桌面上,当用户按下屏幕上的一个按钮时,事件管理器会接收到这个动作的消息,然后将消息分发给相应的窗口对象。

窗口管理器会处理这个消息,并更新显示界面。

同时,GDI会负责在屏幕上绘制这个按钮的图像,以及实现按钮的各种交互效果。

总结来说,安卓GUI原理就是指安卓系统中的图形用户界面(GUI)的设计原理和实现机制。

它包括事件管理、窗口管理、GDI管理和系统体系构架及其数据流等方面的内容。

这些原理和机制共同作用,使得安卓GUI能够提供流畅的用户体验和丰富的交互功能。

gui编程 原理

gui编程 原理

gui编程原理GUI编程是指图形用户界面编程,它是一种以图形方式显示和操作程序界面的编程方式。

相比于命令行界面,GUI界面更加直观、友好,用户可以通过鼠标点击、拖拽等方式与程序进行交互。

GUI编程的原理主要涉及以下几个方面:1.用户界面设计:GUI编程的核心是用户界面的设计,包括窗口、按钮、文本框等各种控件的布局和样式。

用户界面设计需要考虑用户的使用习惯和心理认知,尽可能简化操作步骤,提高用户的使用效率和体验。

2.事件驱动:在GUI编程中,用户的操作会触发各种事件,如点击按钮、拖拽窗口等。

程序需要响应这些事件,并执行相应的操作。

事件驱动是指程序通过监听和处理事件来控制程序的执行流程,使得程序能够根据用户的操作动态地相应变化。

3.图形绘制:GUI界面的显示需要通过图形绘制来实现。

图形绘制可以使用底层的图形库或者使用高级的图形界面开发工具,通过调用相应的绘图接口来实现图形的绘制和渲染。

绘制的图形可以是各种形状、颜色和样式,通过组合和布局来实现界面的设计。

4.控件管理:GUI界面通常包含各种控件,如按钮、文本框、下拉列表等。

控件管理是指对这些控件进行创建、显示和管理。

程序需要将这些控件添加到窗口中,并设置好相应的属性和事件处理函数,使得控件能够正确响应用户的操作。

5.数据交互:GUI编程通常需要与后台数据进行交互,如从数据库读取数据显示到界面上,或者将用户输入的数据保存到数据库中。

数据交互需要通过数据库的操作接口或者网络通信协议来实现,程序需要根据业务逻辑将用户输入的数据与后台数据进行交互。

6.界面布局:界面布局是指如何将各种控件和图形进行排列和组织,使得界面更加美观和功能合理。

界面布局可以使用手动布局或者自动布局的方式实现,通过设置相应的布局属性和规则,使得控件能够根据窗口的大小和其他因素进行自动调整。

GUI编程的原理是将用户界面、事件驱动、图形绘制、控件管理、数据交互和界面布局等多个方面进行综合考虑,通过合理的设计和实现,使得程序能够提供直观、友好的图形界面,并能够与用户进行交互。

ucGUI移植详细设计及总结

ucGUI移植详细设计及总结

ucGUI移植详细设计及总结序本文档阐述了将ucGUI移植到IM12上的过程。

ucGUI版本为3.9,移植到IM12上,触摸屏及按键能够正常使用。

在ucGUI源码包的基础上,添加了一些接口函数以适应IM12,在使用时应该根据情况使用这些接口,这些新增加的函数的接口将在后面章节中详细讲述。

此外,适应IM12的ucGUI在Wind River Workbench 3.0环境下被编译成两个静态库文件libNoWindow.a和libWindow.a,编译程序时应该连接这两个库。

文档篇章安排如下:第一章,ucGUI源码包简介。

主要介绍了所使用的ucGUI图形库中各文件夹的内容及功能,并对IM12中与ucGUI移植相关的部分,包括触摸屏、LCD、按键板等进行了简单的介绍。

第二章,图形库移植。

阐述如何对ucGUI进行配置、编译,以在IM12的LCD上显示图形,此部分还未实现触摸屏及按键功能,只是纯粹的显示而已第三章,触摸屏移植。

第四章,按键移植。

第五章,带触摸屏及按键功能的ucGUI应用程序模板。

第一章ucGUI源码包简介ucGUI要移植到im12上,实际上就是根据im12的情况修改ucGUI中的一些配置项,或增加、删减一些程序以适应im12,同时要保持ucGUI的特性。

要做好移植工作,需对ucGUI 及IM12相关部分有足够的了解。

1.1ucGUI简介移植所采用的ucGUI版本为3.9,主要包含的文件夹如图1所示图1 ucGUI源码结构图各文件夹的主要内容如下:Config ----------- 配置文件GUI ----------- 源代码GUI_X ---------- 操作系统接口函数定义文件GUI 源代码文件:1)AntiAlias: 抗锯齿显示效果支持。

2)ConvertColor: 彩色显示的色彩转换支持。

3)ConvertMono: (b/w)和灰度显示的色彩转换支持。

4)Core: 核心文件,提供了GUI基本的功能。

UCGUI窗体管理及消息处理机制分析

UCGUI窗体管理及消息处理机制分析

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 那么多的消息种类及复杂处理。

深入理解ucGUI消息处理机制如何实现

深入理解ucGUI消息处理机制如何实现

FRAMEWIN_Handle FRAMEWIN_CreateAsChild( int x0, int y0, int xsize, int ysize, WM_HWIN hParent, const char* pText, WM_CALLBACK* cb,j; /* Create the window */
问这个特殊的节点才能进入我们用户定义的回调函数, 我们才能利用 GUI 干我们自己想做的 事情。好了注意到这一点之后,我们再来分析这主窗口和客服窗口的回调函数。
WM_HWIN WM_CreateWindowAsChild( int x0, int y0, int width, int height ,WM_HWIN hParent, U16 Style, WM_CALLBACK* cb ,int NumExtraBytes) { ; WM_Obj* pWin pWin; WM_HWIN hWin; WM_LOCK(); Style |= WM__CreateFlags; /* Get Parent info */ if (!hParent) { if (WM__NumWindows) { hParent = WM_HBKWIN; } } if (hParent) { GUI_RECT Rect; // Rect = WM_H2P(hParent)->Rect; WM_GetInsideRect(hParent, &Rect); WM__Client2Screen(WM_H2P(hParent), &Rect); x0 += Rect.x0; y0 += Rect.y0; if (width==0) width = Rect.x1-Rect.x0+1; if (height==0) height = Rect.y1-Rect.y0+1; } if ((hWin = (WM_HWIN) WM_ALLOC(NumExtraBytes+sizeof(WM_Obj))) == 0) { GUI_DEBUG_ERROROUT("WM_CreateWindow: No memory to create window"); } else { WM__NumWindows++; pWin = WM_H2P(hWin); memset (pWin, 0, sizeof(WM_Obj)); /* erase this data structure The explicit zero-init is no longer needed since the entire data structure is already zeroed. The advantage is that it reduces program size. */ pWin->Rect.x0 = x0; pWin->Rect.y0 = y0; pWin->Rect.x1 = x0+width-1;

uCGUI介绍(8)解析

uCGUI介绍(8)解析

2018/10/19

13
2018/10/19

14
仿真器API
2018/10/19

15
文本显示
2018/10/19

16
文本显示
2018/10/19

2018/10/19

10
仿真器的目录结构
目录“Application”包括演示程序 的源代码。
目录“Exe”包括一个“ready-touse”演示程序。 目录“GUI”包括库文件和库使用 的包含文件。 目录“Sample”包括仿真范例及其 源代码。 目录“Simulation”包括仿真所需 的文件。 目录“Tool”包括µC/GUI观察器, 一个演示版的位图转换器和一个演 示版的字体转换器。
2018/10/19 3
硬件需求
2018/10/19

4
uCGUI特点
2018/10/19

5
uCGUI的结构
使µC/GUI和你的应用文件分离。 在工程文件的“root”目录的GUI子目录下保留 所有的程序文件(包括头文件),这是一个好的 习惯。 目录结构应该和下图相似。这种习惯有一个好处, 就是很容易升级更新版本的µC/GUI,只需要替 换GUI目录就可以。
2018/10/19 2
µC/GUI很适合大多数的使用黑色/白色和彩色 LCD的应用程序。
它有一个很好的颜色管理器,允许它处理灰阶。
µC/GUI也提供一个可扩展的2D图形库和一个视 窗管理器。
使用µC/GUI进行软件开发时,并不需要一个目 标系统;只需要使用模拟器,大多数软件就能够 进行开发。然而,最后的目的通常是能够在一个 目标系统上运行该软件。

ucGUI移植详细设计及总结

ucGUI移植详细设计及总结

ucGUI移植详细设计及总结序本文档阐述了将ucGUI移植到IM12上的过程。

ucGUI版本为3.9,移植到IM12上,触摸屏及按键能够正常使用。

在ucGUI源码包的基础上,添加了一些接口函数以适应IM12,在使用时应该根据情况使用这些接口,这些新增加的函数的接口将在后面章节中详细讲述。

此外,适应IM12的ucGUI在Wind River Workbench 3.0环境下被编译成两个静态库文件libNoWindow.a和libWindow.a,编译程序时应该连接这两个库。

文档篇章安排如下:第一章,ucGUI源码包简介。

主要介绍了所使用的ucGUI图形库中各文件夹的内容及功能,并对IM12中与ucGUI移植相关的部分,包括触摸屏、LCD、按键板等进行了简单的介绍。

第二章,图形库移植。

阐述如何对ucGUI进行配置、编译,以在IM12的LCD上显示图形,此部分还未实现触摸屏及按键功能,只是纯粹的显示而已第三章,触摸屏移植。

第四章,按键移植。

第五章,带触摸屏及按键功能的ucGUI应用程序模板。

第一章ucGUI源码包简介ucGUI要移植到im12上,实际上就是根据im12的情况修改ucGUI中的一些配置项,或增加、删减一些程序以适应im12,同时要保持ucGUI的特性。

要做好移植工作,需对ucGUI 及IM12相关部分有足够的了解。

1.1ucGUI简介移植所采用的ucGUI版本为3.9,主要包含的文件夹如图1所示图1 ucGUI源码结构图各文件夹的主要内容如下:Config ----------- 配置文件GUI ----------- 源代码GUI_X ---------- 操作系统接口函数定义文件GUI 源代码文件:1)AntiAlias: 抗锯齿显示效果支持。

2)ConvertColor: 彩色显示的色彩转换支持。

3)ConvertMono: (b/w)和灰度显示的色彩转换支持。

4)Core: 核心文件,提供了GUI基本的功能。

第十讲 uCGUI简介

第十讲 uCGUI简介

1 GUI 概述 1.1 GUI的功能
• GUI的功能 以API函数的形式向应用程序提供图 形界面的操作功能,如描点、画线、填 充、显示控件、字体管理等功能。 可以降低在嵌入式系统开发过程中的 图形操作界面的开发难度,提高效率, 美化界面。
第十讲 uCGUI简介 第十讲 uCGUI 简介
1、GUI 概述 2、GUI常见种类 3、uCGUI 的特点 4、uCGUI的功能函数 5、uCGUI的使用
下图为颜色模式555的效果图:
4 uC/GUI 的功能函数 4.4.6 定义物理调色板
4) 定义物理调色板
在LCDConf.h中定义4种颜色(全部为灰色) 的调色板:
4 uC/GUI 的功能函数 4.4.7 颜色管理函数
4) 颜色管理函数(1)
4 uC/GUI 的功能函数 4.4.8 颜色管理函数
3 uCGUI的特点 3.1.3 uC/GUI 概述
1) uCGUI的特征
• 视窗显示和管理功能; • 支持触摸屏和鼠标的输入; • 具有功能全面的PC机实用软件工具,如模拟 器、观察器、位图转换器、字体转换器等。
3 uCGUI的组成 3.1.4 uC/GUI 概述
2) uCGUI的组成 通常GUI文件放 在工程文件的根目
5) 字体操作函数(1) uCGUI支持ASC11,IOS8859-1,Unicode
字体编码;有宽位图字体、比例位图字体、
2bpp (bit/pixel)和4bpp比例位图等4种字体
字体的选择在GUIConf.h中定义,字体
需要与应用程序连接在一起。
4 4.5.2 增加字体 uC/GUI 的功能函数
▪文本显示函数 ▪数值显示函数
▪平面(2D)图形库

GUI图形界面编程之事件处理机制

GUI图形界面编程之事件处理机制

GUI图形界⾯编程之事件处理机制事件处理机制三要素:事件源:能够产⽣事件的组件事件:⽤户对组件的⼀个操作事件监听器:接收事件、解释事件并处理⽤户交互的⽅法处理事件源发⽣的事件事件处理机制:当组件(⽐如 Button)被点击时就会产⽣ActionEvent事件,事件被传递给⼀个 ActionListener 对象,再由ActionListener 定义的⽅法来响应处理事件(⾃动调⽤ActionEvent)当事件发⽣后,将某事件的对象传递给事件监听器(事件监听器实现了发⽣此事件所对应的接⼝),事件监听器会处理此事件,为了监视此事件,事件的处理⽅要先向发⽣⽅注册事件有很多种,监听事件所实现的接⼝也有很多种。

监听哪件事,就必须实现此事件的接⼝。

事件与监听事件的接⼝⼀⼀对应按钮事件处理机制:按钮事件(ActionEvent):组件的特定动作(⽐如被按下)发⽣时,由组件(⽐如Button)⽣成此⾼级别事件要使⽤键盘在Button上触发ActionEvent,请使⽤空格键监听器接⼝:ActionListener⼀个监听器监听⼀个事件源对象import java.awt.BorderLayout;import java.awt.Button;import java.awt.Frame;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;/****程序功能:*时间:* @author Administrator*/public class Test1 {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub//创建⾯板及按钮Frame f=new Frame();Button b=new Button();f.add(b,BorderLayout.NORTH);f.setVisible(true);f.setResizable(true);f.pack();//创建监听器Monitor bh=new Monitor();//事件注册:表⽰监听器bh监听对象b,当事件发⽣后,调⽤接⼝中的⽅法b.addActionListener(bh);}}class Monitor implements ActionListener{//当事件触发时执⾏此⽅法//当事件发⽣后,把此事件具体信息封装成对象传递给此函数的参数epublic void actionPerformed(ActionEvent e){System.out.println("Press\n");}1个监听器监听多个事件源对象import java.awt.BorderLayout;import java.awt.Button;import java.awt.Frame;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;/****程序功能:*时间:* @author Administrator*/public class Test1 {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub//创建⾯板及按钮Frame f=new Frame();Button b1=new Button();Button b2=new Button();f.add(b1,BorderLayout.NORTH);f.add(b2,BorderLayout.CENTER);f.setVisible(true);f.setResizable(true);f.pack();//创建监听器Monitor bh=new Monitor();//事件注册:表⽰监听器bh监听对象b,当事件发⽣后,调⽤接⼝中的⽅法b1.addActionListener(bh);b2.addActionListener(bh);//重设提⽰b2.setActionCommand("Stop");}}class Monitor implements ActionListener{//当事件触发时执⾏此⽅法//当事件发⽣后,把此事件具体信息封装成对象传递给此函数的参数epublic void actionPerformed(ActionEvent e){System.out.println("Press\n"+e.getActionCommand());}}TextField 对象可能发⽣Action(光标在⽂本框中敲回车)事件,与该事件对应的事件类是java.awt.event.ActionEvent. java.awt.event.ActionListener接⼝处理ActionEvent事件创建⽂本框并实现⽂本框输⼊显⽰到命令⾏中⽂本框输⼊内容不可见import java.awt.Frame;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class Test2 {public static void main(String[] args) {// TODO Auto-generated method stubnew TextFieldDemo();}class TestFieldDemo extends Frame {TestField tf=null;Monitor2 m=null;TestFieldDemo(){//创建⾯板tf=new TestField();this.add(tf);this.setVisible(true);this.pack();//设置此⽂本字段的回显字符(⽤于输⼊密码)tf.setEchoChar('*');//创建监听器m=new Monitor2();//注册tf.addActionListener(m);}}class Monitor2 implements ActionListener{public void actionPerformed(ActionEvent e){TextField tf=(TextField)e.getSource();System.out.println(tf.getText());tf.setText("");}}内部类:可以⽅便的访问包装类的成员变量或成员⽅法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UCGUI 窗体管理及消息处理机制分析----多对话框/模态窗体/透明窗体支持分析问题的提出:[求助]关于对话框处理程序中,想在OK 按钮按下后想弹出一个消息框,该怎么做?直接加在程序中好像不行,如何让消息框弹出后成为模态窗体呢?请版主帮帮忙。

[解析]在UCGUI 中,对话框只支持单个对话框窗体,不支持多个独立的对话框,现在我们从其源码来分析一下它为什么支持单个对话框窗体以及如何改进它以支持多个独立对话框,要讲解这个问题我们必须首先理解UCGUI中的窗体消息LOOP,没有消息LOOP 窗体就是死水一潭,不能接受任何外界的输入,只是一个画在那里的图画而已。

[声明]本文中提到的源码均为UCGUI3.24 版源码,新版UCGUI 源码会有改动,请下载本文示例代码来结合阅读本文。

摘要: 本文主要介绍了UCGUI 中的对话框的消息处理机制,并指出在现有UCGUI 上如何增加多窗体支持,并在分析解决问题时着重介绍了其输入设备消息WM_TOUTCH 及WM_KEY 两类消息处理方法,并同时初步指出一种在UCGUI 中实现模UCGUI 窗体管理及消息处理机制分析态对话框以及透明窗体的原理说明,不还有窗体重画消息WM_PAINT 消息处理原理。

各种基本消息介绍及处理流程对话框内部消息流转及外部消息LOOP 分析.UCGUI 是采用的消息驱动的,它专门有对外的一套收集消息的接口, 在模拟器中, 就是通过LCD 模拟显示屏窗口的MOUSE 消息,将MOUSE 消息传入到这个接口中, 以驱动UCGUI 中的窗体的。

UCGUI 中的消息驱动其实与WINDOWS 的是类似的,几种基本的消息与WINDOWS 是一样的,但UCGUI 的更简单且消息更少,对于一些消息的处理得也很简化,没有WINDOWS 那么多的消息种类及复杂处理。

在WINDOWS 中,如我们处理按钮控件的点击事件的是在WM_COMMAND 消息中,通过按钮的标志ID 来区分不同的按钮,所以按钮标志ID 必须不同的,否则无法区别开(除非不在父窗体的WM_COMMAND 消息中处理)。

UCGUI 中一些基本的消息如下:WM_CREATE---窗体创建消息每创建一个窗体完后都会向该窗体发送此消息,如WM_CreateWindowAsChild 创建完窗体均会发一此消息,但在UCGUI 中对于此消息的很少处理,如果用户想在对话框之后做些初始化操作或是创建其它子窗体的动作,可以处理此消息,不过对话框一般有专门的初始化消息WM_INIT_DIALOG,它是在创建对话框后发送的。

WM_SHOW-----显示窗体消息此消息在UCGUI 中各控件窗体内均未作处理,如果你通过消息发送函数来发送这类没有在UCGUI 中各窗体中处理的消息,是没有有什么响应的,不要感到奇怪。

要显示窗体一般是通过WM_ShowWindow()函数实现的,这个函数做的也就是改变窗体显示标志[WM_SF_ISVIS],并使窗体矩形区域无效[WM_InvalidateWindow()]以产生重画消息。

WM_SET_ENABLE---设置窗体不能使用消息UCGUI 中有一种复选框为不可改变的,但是这个功能也不完全,如果你对着UCGUI 中的按钮使用WM_DisableWindow()来设置其无效,按钮照样还是可以使用,不过要改进这些小毛病还是很容易的,这里只是提醒大家UCGUI 中很多没有实现的小地方,不要到时候使用时感到很奇怪,感觉到奇怪时最好去看看源码,看看源码中是否实现了此功能,不要郁闷。

WM_PAINT ----窗体重画消息当窗体所在区域全部或是部分区域无效时,系统将会发出该重画消息,将无效区域重画,但UCGUI 中的处理比较简单,都是将窗体全部区域重画;如果用户自己想在窗体上画上一些信息,一般都在在该消息当中画,UCGUI 中的各种提供的系统控件都必须在其系统的提供的消息回调函数中处理此消息来画出控件。

当由外部输入操作引起无效窗体区域产生时,系统都会在消息处理中发送该消息到窗体消息回调函数中,以重画此窗体,在下面讲解消息循环机制时将会着重讲解到该消息的产生。

[透明窗体]---经常有朋友想知道在UCGUI 中如何实现透明窗体,透明窗窗体显示在前台时,可以看到部分位于其窗体后的内容,即透过窗体可以看到窗体背后的图象。

在UCGUI 中有关于透明窗体的设置选项,可是没有实现此功能,其实要实现原理如下:第一透明窗体及其所有子窗体都必须透明处理;第二是对于所有有透明属性的窗体,在绘图时必须使用透明填充功能的矩形填充函数,主要是修改窗体的WM_PAINT 消息中画窗体时的矩形填充函数为透明的矩形填充;第三透明的矩形填充函数的实现,通常情况下的矩形填充是以当前前景色来填充,那么关键就是实现画点函数的透明填充,要使一个透明,可以取当前显存中存点的点的RGB 颜色,然后再与当前要画的颜色按照一个比例进行混合得一个新的RGB 值,再将此值画以屏幕上就可能实现透明填充的效果。

WM_TOUCH----处理类似MOUSE 的滑动操作方式的输入外设的消息,如触摸屏一般都是将其消息从硬件接收到后转化为该消息形式发送出去,该消息中必须包含消息在屏幕中的发生位置坐标及输入设备状态(按下状态或弹起状态),此消息在任务消息循环中循环处理,一旦产生就会发送给当前焦点窗体,在后面将详细讲解该消息的处理机制。

WM_KEY------处理类似KEY 的按键式操作的输入外设的消息,消息中必须包含按键的按下或弹起状态,此消息也是在任务消息循环中循环处理,一旦产生就会发送给当前焦点窗体,讲解消息LOOP 时再详细介绍。

WM_SET_FOCUS----讲到刚才上面的两个消息时,就反复提到了当前焦点窗体的概念,所有外部输入设备消息都是发送给当前焦点窗体的,用户可以通过此消息来设定当前的焦点窗体。

外部输入操作也会改变当前焦点窗体,如点击某窗体时会在该窗体的WM_TOUCH 消息处理中设置该窗体本身为当前焦点窗体;当在对话框中按键TAB 键时,同样也可以将焦点在对话框上各控件间切换,这是在对话框的WM_KEY 消息中处理实现的[了解一下WM_SetFocusOnNextChild()函数],是根据创建对话框时指定的资源定义数组中的顺序来切换的,并没有WIN 下面指定的TabIndex 这样一个值来指定次序的值。

WM_NOTIFY_PARENT---这个消息将子窗体的外设输入的消息传送到它的父窗体,因为一般的情况下消息都是在父窗体中统一处理的,如对话框中的按钮点击事件,一般都是在用户自定义的窗体消息处理函数中处理,所以就必须要子窗体将获取的输入外设的消息传送给父窗体,这样才能在父窗体中进行子窗体的点击事件消息的处理,这个消息的机制类似WIN 下面的WM_COMMAND 消息,处理该消息时通过控件ID 来区别不同的控件,通过消息中的通知码来区别控件被操作的各种状态,具体这个消息的详细说明请参见后面的分析。

WM_DELETE---要删除窗体时发送的消息,主要清除窗体数据结构所占用内存,此消息主要由WM_DeleteWindow()函数发送了,如点击OK 按钮关闭对话框时,最终会调用此函数来删除窗体,不过UCGUI 中没有最大化最小化关闭等系统功能按钮。

最基础窗体结构注解如下,在该结构中有两个很重要的成员,hNextLin 是记载窗体的下一个窗体,这个成员用于遍历所有已经创建的窗体;hNext 是记载窗体下一个兄弟窗体,这个成员用于遍历每个窗体对应的子窗体;这个结构是最基础,一般的控件在这个结构之上还会有一些扩展的结构,如按钮对应有WIDGET_HandleActive()—基础控件共通消息处理,在大部分的UCGUI 控件中都会在消息回调函数的头部进行这个调用,如果处理了消息后,就直接退出消息回调函数的调用。

这个函数中处理如下消息:— WM_GET_ID[返窗体控件标志ID].— WM_SET_FOCUS[设置当前窗体为焦点窗体,设置完后还必须向该窗体的父窗体发送一个WM_NOTIFY_CHILD_HAS_FOCUS 消息让其父窗体更新它记载的当前焦点子窗体].— WM_GET_HAS_FOCUS[获取当前窗体是否为焦点窗体].— WM_SET_ENABLE[设置窗体为不可用窗体] .— WM_GET_ACCEPT_FOCUS[获取当前窗体是否可设置为焦点窗体].— WM_GET_INSIDE_RECT[返回窗体内框矩形,如按钮有3D 效果时会有效果边框宽度,内框矩形就是窗体矩形被边框剪裁后的矩形].WM_DefaultProc()----窗体默认消息处理函数,UCGUI 中提供一些基础的控件,这些控件有些共通的消息均在此处理,如下:— WM_GETCLIENTRECT[获取窗体矩形区域,相对于矩形自身]— WM_GETORG[获取窗体矩形左上角坐标].— WM_GET_INSIDE_RECT[获取窗体矩形区域,相对屏幕].— WM_GET_CLIENT_WINDOW[获取窗体客户区子窗体句柄,如对话框的中的子窗体FrameWin 即为此种窗体].— WM_KEY[铵键消息处理,通知父窗体子窗体的按键消息,有些控件自己要处理这个消息,如Edit 控件处理完此消息后就没有再调用WM_DefaultProc(),从而没有将WM_KEY 消息通父窗体;如Button 控件,根本没有对此消息进行处理,直接是通过默认处理发给了父窗体处理;有些控件如Checkbox 自己处理该消息,同时也调用默认消息处量将此消息通知父窗本,此种消息源窗体为子控件,目标窗体为父窗体。

如此处理WM_KEY 消息完全是UCGUI 中如此做,在WIN 中并没有这样做].— WM_GET_BKCOLOR[获取窗体背景色,在此未实现,返回0xfffffff值,但FrameWin 窗体实现了此消息处理].在UCGUI 的对话框的窗口消息处理函数中OK 按钮的点击事件, UCGUI 的处理方法与UCGUI 中的消息种类不多, 只有差不多不到二十种,但对于嵌入式系统来说已经完全足够了,用户可以自定义消息(从WM_USER 起)。

WM_NOTIFY_PARENT 这个消息是由子窗体传送给父窗体的, 由消息的名字也可以看出这一点,OK 按钮也是一个窗体,当MOUSE 点击在它上面时,UCGUI 首先会传递一个WM_TOUCH 消息到OK 按钮的窗口消息处理函数,OK 按钮是一个系统提供的控件,系统已经提供了一个默认的消息的窗口消息处理函数,这个函数会处理大部分的默认窗口消息并随后将此消息转发给父窗体,即WM_NOTIFY_PARENT 消息,它是由函数WM_NotifyParent(hObj, Notification)实现的. WM_TOUCH 消息在按钮的消息处理函数_BUTTON_Callback 中的_OnTouch 函数中处理,在处理过程完后会调用WM_NotifyParent 向按钮的父窗体发WM_NOTIFY_PARENT 消息告诉对话框回调函数按钮被点击了,这个过程再说详细一点是这样的:点击OK 按钮.产生按钮WM_TOUCH 消息.UCGUI 中的消息LOOP 调用按钮默认的按钮窗口消息处理函数_BUTTON_Callback._OnTouch 默认处理按钮点击并发送给父窗体WM_NOTIFY_PARENT 消息,这里要注意MOUSE 点击后,有三种情况:第一种是点击后在按钮范围内弹出MOUSE,这种情况下,会送的消息中还有一个通知码就是WM_NOTIFICATION_RELEASED;第二种情况是点击拖到按钮范围外弹起MOUSE,此时通知码是WM_NOTIFICATION_MOVED_OUT;第三种情况是点击后一直未弹起MOUSE 的过程中消息通知码为WM_NOTIFICATION_CLICKED;在这个函数中还会处理设置按钮点击后MOUSE 至未弹起前的按下状态,这样在按钮下一次画出时就会以按下的状态显示出来. 默认的对话框窗体消息处理函数_FRAMEWIN_Callback 收到WM_NOTIFY_PARENT 消息并最终传送该消息到用户自己定义的对话框消息处理函数,这里要注意的一点是,其实对话框对话框主要是由一个FrameWin 子窗体构成的,这个子窗体大小为对话框指定的大小,对话框上的其它控件是都是FrameWin 的子窗体,由_FRAMEWIN_Callback 传送的消息首先是传送到对话框的默认窗体消息回调函数_cbDialog,然后再经它传送到用户自定义的窗体回调函数当中。

相关文档
最新文档