1、嵌入式GUI设计.ppt_第1页
1、嵌入式GUI设计.ppt_第2页
1、嵌入式GUI设计.ppt_第3页
1、嵌入式GUI设计.ppt_第4页
1、嵌入式GUI设计.ppt_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式GUI设计,陈俊彦,嵌入式GUI概述,什么是GUI? 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。,嵌入式GUI的特点,嵌入式GUI的广泛应用是当今计算机发展的重大成就之一,它极大地方便了非专业用户的使用,人们从此不再需要面对功能单一的按键和死记硬背大量的命令,取而代之的是可以通过窗口、菜单、按钮等方式来方便地进行操作。 嵌入式GUI具有下面几个方面的基本要求:轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点。,

2、嵌入式GUI的准则,减少用户的认知负担 保持界面的一致性 满足不同目标用户的需求 用户界面友好性 图标识别平衡性 图标功能一致性 建立界面与用户的互动交流 可操控性和扩充性的易用性,嵌入式GUI的应用领域,手机通讯移动平台 平板电脑 数码产品 车载系统产品 智能家电产品 工业数控平台,嵌入式GUI的组成部分(一),桌面 在启动时显示,也是界面中最底层,有时也指代包括窗口、文件浏览器在内的“桌面环境”。在桌面上由于可以重叠显示窗口,因此可以实现多任务化。 视窗 应用程序为使用数据而在图形用户界面中设置的基本单元。应用程序和数据在窗口内实现一体化。在窗口中,用户可以在窗口中操作应用程序,进行数据的

3、管理、生成和编辑。通常在窗口四周设有菜单、图标,数据放在中央。,嵌入式GUI的组成部分(二),单一文件界面 在窗口中,一个数据在一个窗口内完成的方式。在这种情况下,数据和显示窗口的数量是一样的。若要在其他应用程序的窗口使用数据,将相应生成新的窗口。因此窗口数量多,管理复杂。 多文件界面 在一个窗口之内进行多个数据管理的方式。这种情况下,窗口的管理简单化,但是操作变为双重管理。,嵌入式GUI的组成部分(三),标签 多文件界面的数据管理方式中使用的一种界面,将数据的标题在窗口中并排,通过选择标签标题显示必要的数据,这样使得接入数据方式变得更为便捷。 菜单 将系统可以执行的命令以阶层的方式显示出来的

4、一个界面。一般置于画面的最上方或者最下方,应用程序能使用的所有命令几乎全部都能放入。,嵌入式GUI的组成部分(四),图标 显示在管理数据的应用程序中的数据,或者显示应用程序本身。应用程序的图标只能用于启动应用程序。 按钮 菜单中,利用程度高的命令用图形表示出来,配置在应用程序中,成为按钮。应用程序中的按钮,通常可以代替菜单。,嵌入式GUI的分类(一),低端嵌入式GUI: C/GUI、RT-Thread/GUI 适用平台: 单片机、ARM7、ARM Cortex-M 开发语言: C语言 操作系统: C/OS、RT-Thread,嵌入式GUI的分类(二),中端嵌入式GUI: miniGUI、Ope

5、nGUI、 Microwindows 适用平台: ARM7、ARM9、ARM11、 ARM Cortex-R 开发语言: C语言 操作系统: 嵌入式Linux、C/Linux,嵌入式GUI的分类(三),高端嵌入式GUI: Qt/Embedded( Qtopia )、Android、MFC 适用平台: ARM9、ARM11、ARM Cortex-A 开发语言: C+语言、JAVA语言 操作系统: 嵌入式Linux、Win CE/Win Phone,RT-Thread/GUI,RT-Thread是一款来自中国的开源实时操作系统,由国内一些专业开发人员开发、维护。它不仅仅是一款高效、稳定的实时核心,

6、也是一套面向嵌入式系统的软件平台,覆盖了全抢占的实时操作系统内核,小巧而与底层具体实现无关的文件系统,轻型的TCP/IP协议栈以及轻型的多窗口多线程图形用户界面。 RT-Thread/GUI是一个图形用户界面,它专为RT-Thread操作系统而开发,并在一些地方采用了RT-Thread特有功能,这个图形用户界面组件能够为RT-Thread上的应用程序提供人机界面交互功能。,RT-Thread/GUI组件功能,多线程图形用户界面 依赖与RT-Thread线程调度器的实时图形用户界面 创新地在嵌入式系统中引入面板(panel)的概念,缩小了多线程,多窗口GUI编程代价 C语言方式的全面向对象设计

7、界面主题支持 中文文本显示支持 丰富的控件支持,RT-Thread/GUI架构,RT-Thread/GUI采用传统的客户端/服务器的结构,但和传统的C/S架构中把绘画操作放于服务器不同的是,绘画操作完全由客户端自行完成。服务端仅维护着各个客户端的位置信息,服务端,当一个图形应用(workbench)或者窗口(window)需要创建时,需要向GUI服务端请求允许创建相应的实例。GUI服务端将记录下相应的位置信息。在RT-Thread/GUI中,屏幕会被分隔成数个互不相重叠的面板(panel)。面板数也可以只有一个(即全屏),或所有面板拼接成的总体面积并不完全覆盖真实的物理屏面积。 服务端提供的功

8、能主要是客户端(线程)的管理及鼠标、键盘事件的派发,服务端模块,GUI Server 服务端事件处理主线程 Panel 面板及面板之上的线程维护 TopWin 顶层窗口信息维护 Mouse 鼠标相关信息处理,面板(Panel),RT-Thread/GUI服务端维护着屏幕的面板划分,并且面板与面板之间是相互不重叠。 注册面板可以通过如下函数接口进行: void rtgui_panel_register(char *name, rtgui_rect_t *extent) 例子:rtgui_rect_t rect; rect.x1 = 0; rect.y1 = 0; rect.x2 = 240; r

9、ect.y2 = 320; rtgui_panel_register( “main”, ,TopWin,当应用线程需要创建窗口时,需要向GUI服务端请求创建,并把它的位置信息送给服务端。服务端在收到窗口创建请求后,需要把它的位置信息加入到topwin列表中,并根据它的情况决定是否添加边框、标题信息。,鼠标键盘,鼠标与键盘的处理亦由GUI服务端处理,它们都转换成消息事件的方式进行处理。所以鼠标、键盘驱动最主要的方法就是:把相应的鼠标状态和键值转换成事件的形式发送给GUI服务端线程。 发送给GUI服务端的函数是: void rtgui_server_post_event( struct rtgui

10、_event *event, rt_size_t size );,客户端,一个客户端是一个独立的可执行体:线程 客户端会负责大部分的UI操作 客户端线程的主要操作分为两大类:事件处理和绘图操作 客户端根据上层应用的不同相应的分成了两类:workbench和window Window可以是一个独立窗口(具有独立线程),也可以是workbench下的附属窗口(事件处理,绘图操作依附于workbench线程) GUI客户端需要建立相应的事件处理消息队列,workbench(一),workbench是附着在面板上的应用程序,每一个workbench具备独立的线程执行上下文环境,相应线程具备自己的消息邮

11、箱,其事件处理循环即为处理达到的消息事件。创建一个 workbench 时,应用程序需要主动发送相应事件给 GUI 服务端并且给出它附着 (attach) 的面板名称。如果 GUI 服务端获得 workbench 的附着请求后,查询系统中确实存在相应面板,它将把相应面板的信息返回给 workbench 以允许它在上面进行显示。当 workbench 获得了面板信息后,它将能够在绘图时直接调用底层图形驱动接口进行相应位置的绘图。,workbench消息处理序列图,workbench(二),创建一个workbench应用,主要有三点: 1、创建相应的线程(执行环境); 2、提供相应的事件处理消息队

12、列; 3、执行workbench的事件循环 RT-Thread/GUI支持两种模式,小模式和标准模式。当使用小模式时,相应的内存占用更少。而标准模式则支持更多的回调函数,并且支持自动布局引擎。当使用小模式时,消息队列的单个消息可以相应小一些,但不能小于32字节,window,创建一个独立的window应用,主要有三点: 1、创建相应的线程(执行环境); 2、提供相应的事件处理消息队列; 3、执行window的事件循环 窗口是具备最高优先级的,永远位于workbench的顶端,适合做为消息窗口或输入显示出来,设备上下文,客户端绘图,需要在正 确的地方绘制,例如当一个window在一个workbe

13、nch之上时。当workbench 需要更新,它不能够把 window 覆盖的区域给错误地绘成自己的图形。所以当一个客户端需要绘图时,它需要一个知道它当前所在区域的上下文环境,这个就是:(图形) 设备上下文。,设备上下文种类,设备上下文(Device Context)可以认为是能够绘图的一个上下文环境。 当前RT-Thread/GUI中包括两种DC: 1、硬件DC,即支持操作目标硬件的上下文环境 struct rtgui_dc *rtgui_dc_hw_create( rtgui_widget_t *owner ) 2、缓冲DC,即仅仅针对缓冲区进行绘图的上下文环境 struct rtgui_

14、dc *rtgui_dc_buffer_create( int width, int height ),RT-Thread/GUI控件类继承图,各个控件类列表,widget控件,rtgui_widget是RT-Thread/GUI系统中控件相关的基类,描述了 GUI 中一个控件的基本特性,定义了最基本的事件处理方法。在 GUI 中的其他各种控件都是从它为源头进行派生,所有通过它派生的对象都能够通过 RTGUI_WIDGET(obj) 的宏转换成 rtgui_widget 控件来使用,并调用相应的函数方法进行处理。,图形上下文,控件的背景色、前景色、文字对齐模式及字体,在RT-Thread/GU

15、I里统称为GC,即图形上下文。 对于控件对象,可以通过如下宏获得相应的数据: RTGUI_WIDGET_FOREGROUND(w) RTGUI_WIDGET_BACKGROUND(w) RTGUI_WIDGET_TEXTALIGN(w) RTGUI_WIDGET_FONT(w) 其中,w是一个rtgui_widget对象,widget部分相关函数,rtgui_widget_create创建新widget控件 rtgui_widget_destroy删除widget控件 rtgui_widget_set_event_handler设置widget控件的事件处理函数 rtgui_widget_ev

16、ent_handler widget控件的默认事件处理函数 rtgui_widget_focus设置控件的焦点 rtgui_widget_unfocus去除控件的焦点,container控件,rtgui_container被设计成RTGUI中的一个容器类,它允许在它之下包含数个子控件,子控件的大小位置必须在container大小位置之内,否则自动被剪切掉。rtgui_container内的控件绘图次序是按照从上到下的次序进行的。 container结构体:,container部分相关函数,rtgui_container_add_child在container容器中添加一个子控件 rtgui_c

17、ontainer_remove_child在container容器中删除一个子控件 rtgui_container_destroy_children在container容器中删除所有子控件 rtgui_container_get_first_child获得container容器中第一个子控件,label控件,label控件是一个文本标签,在屏幕相应位置显示相应的文本。其中最主要的属性是显示的文字文本。 相关函数 rtgui_label_create创建label控件 rtgui_label_destroy删除label控件 rtgui_label_event_handler控件默认事件处理 r

18、tgui_label_set_text设置标签文本 rtgui_label_get_text获得标签文本,button控件,button控件是一个带标签的按钮控件,继承自 rtgui_label ,所以label的方法也可应用于 button 控件。 相关函数: rtgui_button_create创建一个按钮控件 rtgui_pushbutton_create创建push按钮控件, ,即按下按钮时,按钮的状态将被保持,而不是当鼠标抬起时,按钮自动恢复为原样。只有当鼠标再次点击按钮时,它才能恢复到初始状态。,button控件(二),rtgui_button_destroy删除按钮控件 rtg

19、ui_button_set_pressed_image设置按钮按下时显示图像 rtgui_button_set_unpressed_image设置按钮正常状态时显示图像 rtgui_button_set_onbutton设置按钮控件发生按下事件时指向被调用的回调函数指针 rtgui_button_event_handler rtgui_button类的默认事件处理函数,工作台应用workbench,部分相关函数: rtgui_workbench_create创建一个workbench rtgui_workbench_destroy删除workbench rtgui_workbench_even

20、t_handler workbench的默认事件处理函数 rtgui_workbench_show显示一个workbench rtgui_workbench_hiden隐藏一个workbench rtgui_workbench_add_view在workbench上添加一个视图 rtgui_workbench_remove_view在workbench上删除一个视图,工作台视图view,视图可以看成是workbench应用上的一个个面,当然一个时刻workbench只能显示其中一个面,这个面可以调用函数 rtgui_workbench_get_current_view 获得 部分相关函数: r

21、tgui_view_create创建一个视图。视图创建后,需加入到workbench中才能使用 rtgui_view_destroy删除一个视图 rtgui_view_event_handler 视图控件默认的事件处理函数,窗口window,部分相关函数: rtgui_win_create创建一个窗口。在创建窗口时,需要设定上层是否有父控件(通过parent_toplevel 参数)。当有父控件存在时,其事件的上下文执行环境将依赖于父控件所属的线程。当parent_toplevel = RT_NULL时,那么这将是一个独立的窗口,具备独立的线程执行上下文 rtgui_win_destroy删除

22、窗口 rtgui_win_show显示一个窗口 rtgui_win_hiden隐藏一个窗口,RT-Thread/GUI的系统配置,RT-Thread/GUI的配置通常依赖于 rtgui_cong.h头文件 #define RTGUI_NAME_MAX 12 /* RTGUI控件名字长度 */ #define RTGUI_USING_FONT 16 /* 支持16点阵字体 */ #define RTGUI_USING_FONTHZ /* 支持中文字体 */ #define RTGUI_USING_TTF /* 支持TTF字体 */ #define RTGUI_USING_SMALL_SIZE #

23、define RTGUI_USING_MOUSE_CURSOR #define RTGUI_DEFAULT_FONT_SIZE12 #define RTGUI_IMAGE_BMP #define RTGUI_IMAGE_PNG #define RTGUI_IMAGE_JPEG,RT-Thread/GUI的图形驱动,图形驱动是 RT-Thread/GUI 最底层的接口,是上层应用绘图操作的最终反映。 struct rtgui_graphic_driver char* name; /* 设备名称 */ rt_uint16_t byte_per_pixel;/* 每个像素占用字节数 */ rt_ui

24、nt16_t width; /* 屏幕宽和高 */ rt_uint16_t height; void (*screen_update)(rtgui_rect_t* rect); /* 屏幕更新操作 */ rt_uint8_t* (*get_framebuffer)(void); /* 获得硬件视频帧缓冲 */ void (*set_pixel) (rtgui_color_t *c, rt_base_t x, rt_base_t y); void (*get_pixel) (rtgui_color_t *c, rt_base_t x, rt_base_t y); void (*draw_hlin

25、e)(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y); void (*draw_vline)(rtgui_color_t *c, rt_base_t x , rt_base_t y1, rt_base_t y2); void (*draw_raw_hline)(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y); rtgui_list_t list; /* 指向下一驱动列表 */ ;,C/GUI,C/GUI是Micrium公司开发的通用的嵌入式用户图形界面

26、软件。它给任何使用图形LCD的应用程序提供独立于处理器和LCD控制器之外的有效的图形用户接口。可以应用于单一任务环境,也可以应用于多任务环境中。C/GUI能够应用于任何LCD控制器和CPU的任何尺寸的物理显示或者模拟显示中,因为它的代码都是由ANSI的C语言编写的。,C/GUI的特点, 适用于任何8位/16位/32位CPU,可允许于支持ANSI C的任何编译器 适用于任何控制器驱动任何LCD(单色,灰度,或者彩色) 通过配置宏,可支持任何接口 可配置显示尺寸 可在LCD的任何一点上显示字符和画位图 对于显示尺寸和速度提供优化进程,编译时间依赖于采用的优化进程 支持虚拟显示,虚拟显示的尺寸比实际

27、显示大。,C/GUI的软硬件需求,硬件需求 CPU(8/16/32/64位) RAM和ROM 有一个完全的图形LCD(任何类型和分辨率) 小的系统(没有视窗管理器) RAM:100字节 堆栈:500字节 ROM:1025KB 大的系统(包括视窗管理器和控件) RAM:26KB(取决于所需窗口的数量) 堆栈:1200字节 ROM:3060KB 开发环境(软件需求) 需要一个与ANSI兼容的C编译器,C/GUI文件组织 (一),uC/GUIGUIAntiAlias目录: 这个目录中包含9个文件,处理显示的边缘模糊效果,也就是抗锯齿和优化LCD锯齿。液晶屏上画斜线往往都有锯齿,所以通过优化算法进行美

28、化。 uC/GUIGUIConvertColor目录: 这个目录中包含14个.C文件,涉及调色板模式。CGUI的调色板模式支持111模式,222模式,223,323,332,444,555,565,8666等相关模式。我在论文中使用的LCD屏,为单色16级灰度屏,因而不涉及到这些模式。但为了保持UCGUI文件的完整性,该目录以及目录下14个文件,仍然保存在移植文件中。 uC/GUIGUIConvertMono目录: 此目录下的文件描述单色显示的不同模式,包含4个文件。,C/GUI文件组织 (二),uC/GUIGUICore 此目录下包含129个文件,是C/GUI的核心部分。包括GUI头文件,G

29、UI显示各种文本,二进制,十进制,十六进制,字符型文本,字符串,在不同的位置显示二进制,十进制,十六进制,字符型文本,字符串等;GUI设置各种字体;GUI的2-D图形库,GUI绘图函数,在各种位置绘各种点,线,位图,多边形,长方形,圆等等;GUI获取函数,获取当前点,线,位图,多边形,长方形,圆,当前字体,当前二进制,十进制,十六进制,字符型文本,字符串等函数;设置GUI画笔函数;GUI支持的鼠标函数;GUI支持的键盘函数,GUI支持的触摸屏函数;GUI设置LCD函数等等。这些函数,在C/GUI系统中都是必须的函数。正是这些函数的组合,使得C/GUI具有复杂而且完备的图形用户接口。而且,这些函

30、数的组合,使得C/GUI可以单独的使用,也可以通过配置文件,移植到各种操作系统中使用。,C/GUI文件组织 (三),uC/GUIGUIFont 此目录下包含的是C/GUI支持的字体。 uC/GUIGUILCDDriver LCD API目录。该目录下包含很多已经完备的LCD控制器的驱动程序以及API函数。 uC/GUIGUIMemDev MemDev主要用于防止在画交迭图时产生抖动。C/GUI函数绘图不使用MemDev时,画图操作直接写到终端上显示,交迭绘图执行时刷新屏幕,多次刷新时就会出现抖动。例如,要在背景色中画图,且在前景中写一些透明的文字,实现的步骤就是先画图,然后写文字,那么结果就会

31、出现文字的抖动。如果在程序中使用MemDev,则所有的执行操作都在MemDev中执行,当所有的操作都执行完毕之后,最后的结果才会送到屏幕上显示,因而可以避免多次刷新,从而避免抖动。此目录下包含这MemDev的所有函数,包括创建MemDev函数,激活MemDev,执行画图操作,显示到终端,删除MemDev函数等等。,C/GUI文件组织 (四),uC/GUIGUIWidget 此目录包含窗口控件函数,共46个函数。运用窗口管理和回调机制,运用窗口控件函数,可以任意在LCD屏幕上实现类似于windows的界面,这样完备的功能在工业自动化控制和触摸屏应用上有着深远而积极的意义。此目录下的函数主要包括C

32、/GUI的窗口控件,如按钮Button,校验窗Checkbox,编辑区Edit,窗口框Framewin,列表Listbox,进度条ProgBar,音频按钮RadioButton,滚动条ScrollerBar,改变值的灰度条Slider,以及文本框Text相关的各种函数。 uC/GUIGUIWM 此目录包括窗口管理函数,共52个函数。C/GUI中,窗口管理中的消息传递机制和回调机制,也是C/GUI的实现难点和应用难点。4.3节中将详细介绍这两点。此目录下的函数主要包括设置、返回、建立背景窗口、父窗口、各种子窗口以及相应的尺寸、窗口句柄,起点x,y坐标,窗口宽度,高度,位置等等,还包括改变窗口的大

33、小,以及最关键的窗口的回调函数,窗口重绘函数等等,C/GUI视窗管理器,C/GUI的视窗管理器是一个单独的软件,不是C/GUI的基本组成部分。详细代码见uCGUIGUIWM 视窗管理器提供了一套函数,使你能很容易地对许多窗口进行创建,移动,调整大小及其它操作。它也可以提供更低层的支持,这通过管理显示屏上的窗口的层,及通过给你的应用程序发送信号以显示影响它的窗口的修改来完成。 当使用C/GUI视窗管理器时,任何能显示在显示终端上的内容都包含在一个窗口里面,这个窗口是LCD屏幕上的一个给用户画图或者显示目标的区域。窗口可以是任何尺寸的,可以一次在屏幕上显示多个窗口,也可以在其它窗口当中或之前显示窗

34、口。,C/GUI窗口,窗口外形是矩形,由它们的原点(左上角的 X 和 Y 坐标)及它们的 X 和 Y 尺寸(分别是宽和高)所定义。C/GUI 中一个窗口: 1、是一个矩形 2、有一个 Z 坐标 3、可能是隐藏的或可见的 4、可能拥有有效/或无效区域 5、可以或者不可以有透明区域 6、可以或者不可以有一个回调函数,C/GUI视窗管理器相关名词(一),活动窗口: 当前正在用来画图或是显示操作的窗口。 回调函数 回调函数是由用户定义的,当特定事件发生时,指示图形系统调用特定函数的函数。通常当窗口的内容发生改变时,它们用来自动重绘窗口。例如,窗口内显示一幅位图,当窗口移动时,位图并不会自动移动。 子/

35、父窗口 子窗口是相对于父窗口定义的窗口。无论何时,只要父窗口移动,则子窗口们都要相应移动。子窗口被父窗口完全包含。拥有同一个父窗口的子窗口们互相间称为兄弟(同胞)。,C/GUI视窗管理器相关名词(二),客户区 窗口的客户区就是窗口的可用区。如果窗口包含方框或标题栏,则客户区就是方框或标题栏的内部区域。 句柄 当一个新的窗口被创建时,WM分配一个唯一的标识符,称为句柄。句柄用在后续对该窗口操作的所有函数中,而且可以利用该句柄唯一标识该窗口。 有效窗口/无效窗口 有效窗口是一个已经完全更新,不需要重绘的窗口。不管是完全重绘还是局部重绘。当窗口内容发生改变时,WM则标识窗口无效。下一次重绘之后(调用

36、回调函数),窗口又变为有效。,C/GUI视窗管理器相关名词(三),隐藏窗口/显示窗口 一个隐藏的窗口是不可见的,尽管它仍然存在(有句柄)。当创建一个窗口时,如果没有创建指定的标识的话,默认状态是隐藏。使一个窗口可见则可以将其显示;使其不可见则可以隐藏它。 透明 带有透明部分的窗口包括有窗口静止时不被重绘的区域。这些区域的操作就仿佛是下面的窗口可以透过它们显示出来。在这种情况下,下面的窗口在这个透明窗口之前重绘就显得很重要了。WM 能自动处理正确的重绘顺序。,C/GUI视窗管理器相关名词(四),Z-序,底层/顶层 尽管一个窗口是在一个只有X和Y坐标构成的二维的屏幕上显示,WM也管理被认为是 Z-

37、序,或者深度的座标(一个虚拟的三维的坐标),决定窗口从背景到前景放置。因此窗口可以在另一窗口的上面或下面显示。 将一个窗口设置到底层将会把它放在所有同胞窗口(如果存在)的下面;设置为顶层将会把它放在所有同胞窗口的上面。创建一个窗口时,如果没有指定创建标识符,默认情况下它会被设置在顶层。,C/GUI视窗管理器回调机制,C/GUI提供给窗口和窗口控件的回调机制的背后,是一个事件驱动标志。在大多数的窗口系统中,流控不仅仅时从用户程序到图形系统,而且还要能够从用户程序到图形系统,并且能够通过用户程序提供的回调函数,返回到用户程序。这个机制,就称为回调机制。在C/GUI中,回到机制用来在窗口管理中出控制

38、窗口的重绘操作,这使得窗口管理的有效性成为可能。,C/GUI回调函数的使用,使用回调函数建立一个窗口时,必须有一个回调函数。所用的回调函数必须有如下原型: void callback (WM_MESSAGE *pMsg)。 其中pMsg为指向消息的指针。 回调函数执行的功能依赖于所接收到的消息。以上原型后一般跟着switch表达式,表达式定义不同的case表达式下不同的信息对应的不同行为,至少要有一个重绘函数:WM_PAINT()。 设置为视窗管理器执行的回调函数: WM_CALLBACK* WM_SetCallback (WM_HWIN hWin, WM_CALLBACK* cb),C/GU

39、I消息传递机制(一),回调函数执行的功能依赖于所接收到的消息。Switch语句中根据消息的类型,分别执行不同的功能。 WM_MESSAGE的成员如下: MsgId:消息类型 HWin: 目的窗口 HWinSrc: 源窗口 Data.p : 数据指针 Data.v: 数据值,C/GUI消息传递机制(二),MsgId的类型如下: WM_PAINT: 窗口重绘 WM_CREATE: 窗口一建立就发送 WM_DELETE: 窗口一删除就发送 WM_SIZE : 窗口尺寸发生改变就发送 WM_MOVE : 窗口移动就发送 WM_SHOW : 接收到show命令就发送 WM_HIDE : 接收到hide命

40、令就发送 WM_TOUCH: 触摸屏信息 应用程序还可以为自己定义额外的消息。为保证它们不用到uC/GUI的消息ID,用户定义的消息从WM_USER后面开始,如:#define MY_MESSAGE_AAA WM_USER +0,文本显示,在LCD上显示文本,可以调用C/GUI的文本API函数 步骤:1、设定当前光标。2、设定字体。3、显示文本 例如:GUI_GotoXY( 10, 10 ); /设置坐标 GUI_SetFont( ,绘制图形,GUI_DrawLine(int x0, int y0, int x1, int y1 ) 绘一根线 GUI_ClearRect( int x0, in

41、t y0, int x1, int y1 ) 使用背景色填充一个矩形区域 GUI_FillRect( int x0, int y0, int x1, int y1 ) 绘一个填充的矩形 GUI_DrawBitmap( const GUI_BITMAP *pBM, int x, int y ) 绘一幅位图 GUI_DrawCircle( int x0, int y0, int r )绘一个圆 GUI_DrawEllipse(int x0, int y0, int rx, int ry )绘一个椭圆,窗口控件,控件是具有对象性质的窗口,在视窗世界中它们被称为控件,构造用户接口的元素。它们能自动对某

42、些事件起反应;例如,当一个按钮被按下时,它可能以不同的状态显示。控件需要建立,具有能在它们存在的任何时间修改的特性,在它们不再需要时被删除。与窗口类似,一个控件通过它的建立函数返回的句柄而引用。 控件需要使用视窗管理器。一旦一个控件被建立,它被处理成与其它窗口一样;WM保证它在需要的时候能正确的显示(及重绘)。当编写一个应用或一个用户接口时,控件并不需要,但是它们能使编程更容易。,窗口有效控件,按钮控件BUTTON的API,重绘机制,一个控件根据它的特性绘制自己。这一工作通过调用WM的API函数WM_Exec()来完成。如果程序中没有调用WM_Exec(),就必须调用WM_Paint() 函数

43、来绘制控件。在多任务环境中的C/GUI, 一个后台任务通常用于调用WM_Exec()并更新控件(及其它所有带有回调函数的窗口)。这样就不必手工调用 WM_Paint();然而,如果想控件能立即被重绘的话,仍然可使用手工调用方式。 当一个控件的属性被改变时,控件的窗口(或者它的一部分)被标记为无效,但是它不会立即重绘。因此,这部分代码运行非常快。重绘在后面的时间通过WM完成,或通过为控件调用WM_Paint()函数(或者WM_Exec(),直到所有的窗口都被重绘)来强制执行。,C/GUI系统配置,uC/GUIConfig配置目录: GUICONF.h:配置GUI移植到不同操作系统的选项。 GUI

44、TouchConf.h:配置触摸屏的选项以及编写触摸屏的驱动。本文移植C/GUI所使用的LCD屏不支持触摸屏,所以此文件为空。 LCD_Conf.h:LCD显示屏的选项文件,包括bpp,调试板模式,水平、竖直方向的分辨率等等。,LCD驱动程序,一个LCD驱动程序支持一个具体系列的LCD控制器,而所有的LCD都配备一个或多个这些控制器。驱动程序本质上是通用的,意思是它可以通过修改配置文件LCDConf.h来进行配置。这些文件包含所有可配置的选项用于驱动程序,以及多重的定义用于硬件如何访问及控制器如何与LCD连接。 C/GUI自带有一些LCD控制器的驱动程序,在LCD_CONTROLLER宏进行定

45、义。若C/GUI没有相应的驱动程序,则定义LCD_CONTROLLER为0,LCD驱动API函数(一),LCD驱动API函数(二),MiniGUI,MiniGUI是由北京飞漫软件技术有限公司创办的开源Linux图形用户界面支持系统,经过近些年的发展,MiniGUI已经发展成为比较成熟的性能优良的、功能丰富的跨操作系统的嵌入式图形界面支持系统。“小”是MiniGUI的特色,它目前已经广泛应用于通讯、医疗、工控、电子、机顶盒、多媒体等领域。目前,MiniGUI的最新版本为MiniGUI 3.0。MiniGUI对中文的支持最好,它支持GB2312与BIG5字元集,其他字元集也可以轻松加入。,Mini

46、GUI简介(一),MiniGUI 是一款面向嵌入式系统的高级窗口系统和图形用户界面(GUI)支持系统,由魏永明先生于 1998 年底开始开发。2002 年,魏永明先生创建北京飞漫软件技术有限公司,为 MiniGUI 提供商业技术支持,同时也继续提供开源版本,飞漫软件是中国地区为开源社区贡献代码最多的软件企业。最后一个采用 GPL 授权的 MiniGUI 版本是 1.6.10,从 MiniGUI 2.0.4 开始 MiniGUI 被重写并使用商业授权。历经十余年时间, MiniGUI 已经成为性能优良、功能丰富的跨操作系统嵌入式图形用户界面支持系统,支持Linux/uClinux、 Thread

47、X、 eCos、 uC/OS-II、VxWorks等操作系统和数十种 SoC 芯片,已验证的硬件平台包括 ARM-based SoCs 、MIPS based SoCs 、PowerPC、Intel x86 等等,广泛应用于通讯、医疗、工控、电力、机顶盒、多媒体终端等领域。 使用 MiniGUI 成功开发产品的企业有华为、中兴通讯、大唐移动、长虹、TCL、联想、迈瑞、南瑞、炬力、D2 等。这些用户广泛分部在中国大陆、台湾、新加坡、韩国、美国、德国、意大利、印度、以色列等国家和地区。,MiniGUI简介(二),2010年,飞漫软件把最新版的 MiniGUI、mDolphin、mPeer、mStu

48、dio 等系统整合在一起,推出了合璧操作系统(HybridOS)解决方案,是一整套专为嵌入式设备打造的快速开发平台,集成了飞漫软件10年的嵌入式行业研发经验和众多成熟的产品,使众多的希望在嵌入式设备上做开发的中小型企业,摆脱了“不稳定的内核以及驱动程序”、“交叉编译工具链、基础函数库存在大量缺陷”、“不恰当的开源软件”、“高水平嵌入式开发工程师缺乏”等这些问题的困扰,从而能够在一个运行稳定、功能强大的小巧系统内核基础上,专注开发产品。合璧操作系统(HybridOS)采用新的商业授权模式,性价比颇高。 截止2011年5月,MiniGUI的最新版本是3.0.12, MiniGUI 将作为合璧操作系

49、统(HybridOS)的一个组成部分而不断演进,推荐新老用户使用合璧操作系统(Hybridos)作为嵌入式开发平台,必将节省大量的开发成本和时间。,硬件适配,可运行于各种含有 MMU(内存管理单元)的 32 位处理器架构之上,如 ix386、ARM、MIPS、PowerPC 等。 支持低端显示设备(比如单色 LCD)和高端显示设备(8 位色及以上显示设备)。通过 MiniGUI 的图形抽象层及图形引擎技术,还可以支持特殊的显示设备,比如 YUV 显示设备。对显示设备分辨率无最大和最小限制。 副屏支持。当系统中有多个视频设备时,可将一个作为 MiniGUI 的主屏,实现完整的多窗口系统;而其它设

50、备作为副屏,在其上通过 MiniGUI 的图形接口来实现文字渲染、图形显示等功能。 可支持各种输入设备,如 PC 键盘、PC 鼠标、小键盘(Keypad)、触摸屏、遥控器等等。 多种键盘布局的支持。MiniGUI 除支持常见的美式 PC 键盘布局之外,还支持法语、德语等西欧语种的键 盘布局。,系统适配,MiniGUI 的静态存储随配置选项的不同而不同,最少需占用 1MB 静态存储空间。 MiniGUI 启动后,初始占用 1MB 动态存储空间。建议系统内存为 8MB 以上。 支持 Linux 操作系统(非 uClinux 操作系统),可以 MiniGUI-Processes、MiniGUI-Th

51、reads 或者 MiniGUI-Standalone 三种运行模式运行。 内建资源支持。可以将 MiniGUI 所使用的资源,诸如位图、图标和字体等编译到函数库中,该特性可提高 MiniGUI 的初始化速度,并且非常适合无文件系统支持的实时嵌入式操作系统。 针对嵌入式系统的特殊支持,包括一般性的 I/O 流操作,字节序相关函数等。,MiniGUI的技术优势(一),可伸缩性强。MiniGUI 丰富的功能和可配置特性,使得它既可运行于 CPU 主频只有 60MHz 的低端产品中,亦可运行于高端嵌入式设备中,并使用 MiniGUI 的高级控件风格及皮肤界面等技术,创建华丽的用户界面。 轻型、占用资

52、源少。MiniGUI 是一个定位于轻量级的嵌入式图形库,对系统资源的需求完全考虑到了嵌入式设备的硬件情况,如 MiniGUI 库所占的空间最小可以裁剪到 500K 左右。此外,测试结果表明,MiniGUI 能够在 CPU 主频为 30 MHz,仅有 4M RAM 的系统上正常运行(使用 uClinux 操作系统),这是其它针对嵌入式产品的图形系统所无法达到的。,MiniGUI的技术优势(二),高性能、高可靠性。MiniGUI 良好的体系结构及优化的图形接口,可确保最快的图形绘制速度。在设计之初,就充分考虑到了实时嵌入式系统的特点,针对多窗口环境下的图形绘制开展了大量的研究及开发,优化了 MiniGUI 的图形绘制性能及资源占用。MiniGUI 在大量实际系统中的应用,尤其在工业控制系统的应用,证明 MiniGUI 具有非常好的性能。从 1999 年 MiniGUI 的第一个版本发布以来,就有许多产品和项目使用 MiniGUI,MiniGUI 也不断从这些产品或者项目当中获得发展动力和新的技

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论