经常打饱嗝是什么原因| 高血压吃什么| 干疮是什么样子的图片| 梦见打群架是什么意思| 右耳朵热代表什么意思| 乌冬面是什么做的| 三点水加亘念什么| 痛经看什么科| 支原体阳性是什么病| 龟皮痒用什么药膏| 什么是正方形| 40年什么婚| ci是什么意思| pac是什么| rads是什么意思| sm是什么意思啊| 脾囊肿是什么病严重吗| 什么地找| 狗狗打疫苗前后要注意什么| 大生化检查能查出什么病来| 画蛇添足的寓意是什么| 鞘膜积液挂什么科| 韭菜和什么不能一起吃| cpb是什么牌子| 手指头红是什么原因| 恍惚什么意思| 阶级是什么意思| 童心未眠什么意思| 冬瓜吃了有什么好处| negative是什么意思| hbalc是什么意思| 建卡需要带什么证件| 尿蛋白是什么原因| 皇太极叫什么名字| 总梦到一个人说明什么| 心电图异常q波是什么意思| 辛亥革命是什么时候| 98年属虎的是什么命| 什么药能提高免疫力| iu什么意思| 上日下成念什么| 一什么天空| 肝最怕什么| 颈部淋巴结肿大挂什么科| 腰间盘膨出是什么意思| 猪油用什么容器装好| 大红袍适合什么季节喝| 小孩睡觉流口水是什么原因| 眼睑炎用什么药| 梦见小男孩拉屎是什么意思| lsp是什么意思| 69年属鸡是什么命| 咳嗽有白痰吃什么药| 什么样的眼睛形容词| 缺锌有什么症状| 空是什么结构| 志五行属什么| 后背一推就出痧是什么原因| 男马配什么属相最好| 突然高血压是什么原因引起的| 什么食物对心脏好| 2019年是什么生肖| 砥砺是什么意思| 抽血血液偏黑什么原因| 营卫不和吃什么中成药| 财神是什么生肖| 辽国是现在的什么地方| 什么病不能吃松花粉| 牙疼吃什么饭| 富强粉是什么面粉| 6.27什么星座| 梦见洪水是什么意思| 肚子胀气老放屁是什么原因| 乳核是什么| 农历五月初五是什么节| 前列腺不能吃什么食物| 社保缴费基数和工资有什么关系| 瑀字五行属什么| 金疮是什么病| 亚铁是什么| 三剑客是什么意思| mds是什么病的简称| 什么是胎记| 褪黑素有什么副作用| 手掌发红是什么病| 血小板是干什么用的| 肚子老是疼是什么原因| 肛裂是什么症状| 日本天皇叫什么名字| 蓝莓葡萄是什么品种| 杀鸡给猴看什么意思| 竹节棉是什么面料| 龙虾和什么不能一起吃| 为什么会厌学| 女人喜欢黑色代表什么| 疥疮用什么药膏好得快| 什么病不能吃虾| 大林木命适合做什么行业| 胎神是什么意思| bmi指数是什么意思| 小孩脚抽筋是什么原因引起的| 知了幼虫叫什么| 低蛋白血症是什么病| 头出汗多至头发湿透是什么原因| 潘字五行属什么| 被虫子咬了涂什么药膏| 男人肾虚吃什么好| 烂好人什么意思| 小人痣代表什么意思| 肚子左下方是什么器官| 香港特首什么级别| 长闭口是什么原因造成的| 浅表性胃炎伴糜烂吃什么药效果好| 相恋纪念日送什么礼物| 病毒性肝炎有什么症状| 渡人渡己什么意思| 为什么小脑会萎缩| 右手中指指尖麻木是什么原因| 富硒是什么意思| 好哒是什么意思| 打喷嚏流清鼻涕是什么感冒| 外科看什么病| 梦见喝酒是什么意思| 气口是什么意思| 白狗子是什么意思| 活血化瘀吃什么| 验血挂什么科| 40岁男人性功能减退是什么原因| 匈奴是现在的什么民族| 化是什么意思| 益字五行属什么| today什么意思| 大乌龙是什么意思| 喝牛奶不能和什么一起吃| 1月16日是什么星座| 胃溃疡十二指肠溃疡吃什么药| 女真族现在是什么族| 口腔脱皮是什么原因引起的| lane是什么意思| 梦到买房子是什么意思| 去医院验血挂什么科| 桂圆和红枣泡水喝有什么好处| 翻糖蛋糕是什么意思| 舌面有裂纹是什么原因| 九月生日是什么星座| 有点咳嗽吃什么药| 梦见牙掉了一颗是什么意思| 珍珠是用什么做的| 劳烦是什么意思| 吃什么会变丑脑筋急转弯| 2月11日是什么星座| 儿童腮腺炎吃什么药| 凿壁偷光形容什么| 兰州市区有什么好玩的地方| 稠是什么意思| 吃什么食物对胰腺好| 怀孕吃火龙果对胎儿有什么好| 螨虫用什么药可以杀死它| 男性粘液丝高什么原因| 为什么会气血不足| 微量泵是干什么用的| 手机电池为什么会鼓包| 奇花异草的异什么意思| 缺失是什么意思| 清福是什么意思| 胆汁反流用什么药| et是什么| 没经验开什么店最简单| 兆是什么意思| 霉菌是什么东西| 梵蒂冈为什么没人敢打| 7月8号什么星座| 喉咙痛流鼻涕吃什么药| 岁月匆匆是什么意思| 长水泡是什么原因| 蓬头垢面是什么意思| 拮抗药物是什么药| 清明节在什么时候| 女人缺铁性贫血吃什么好| 社保缴费基数和工资有什么关系| 怀孕早期有什么症状| 经常早上肚子疼是什么原因| 口腔扁平苔藓挂什么科| 什么是清宫| 梨是什么季节的水果| 申时是什么时候| 通房是什么意思| nb是什么意思| 咽炎什么症状| 绝育手术对女性有什么危害| 清明为什么插柳枝| 三伏吃什么| 桑拓木命是什么意思| 赤小豆和红豆有什么区别| 怀孕掉头发厉害是什么原因| 红虫是什么的幼虫| 梦见剪头发是什么意思| 4.26是什么星座| 卧底是什么意思| 肝胆湿热用什么药| 梦寐以求是什么意思| 抹茶是什么茶叶做的| 才美不外见的见是什么意思| 什么病不能吃松花粉| 小暑吃黄鳝有什么好处| 九八年属什么生肖| 今年养殖什么最挣钱| lp0是什么意思| 打擦边球是什么意思| 迂回是什么意思| 闪光眼是什么症状| 痔疮吃什么消炎药| 心脏斑块是什么意思啊| 宫颈锥切后需要注意什么| 佞臣是什么意思| 脾虚吃什么食物| 胶体金法是什么意思| 蒲公英茶有什么功效| 飞机打多了会有什么严重的后果吗| 三更是什么生肖| 交通运输是干什么的| 眉心发红是什么原因| 武汉大学校长是什么级别| 文科女生学什么专业好| 区级以上医院是什么意思| 猫什么时候绝育| 宽慰什么意思| 6月6日是什么日子| 房性心律是什么意思| 牛肉丸子配什么菜好吃| 含五行属什么| 什么是意淫| 孕前检查挂什么科| 只羡鸳鸯不羡仙是什么意思| 庚午日是什么意思| 乙肝135阳性是什么意思| 验精挂什么科室| 偶发房性早搏是什么意思| 三秋是什么意思| 肝脏分泌什么| 甩货是什么意思| size是什么意思| cinderella是什么意思| 竹子可以做什么玩具| 血少一撇念什么| 亭台楼阁是什么意思| 为什么会打呼噜| 什么情况属于诈骗| 蚊子喜欢什么气味| id医学上是什么意思| aivei是什么品牌| 尿路感染吃什么药最好| 拍肺部ct挂什么科| 碉堡是什么意思啊| 麻烦是什么意思| 什么时候人流| 履历是什么意思| 无毛猫叫什么| 什么水果补铁效果最好的| 头晕是什么毛病| 一如既往什么意思| 铅华是什么意思| 儿童发育迟缓挂什么科| 整编师和师有什么区别| 百度
工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->综合电路图->综合电路图->一种嵌入式图形用户界面系统的设计与实现

文化部办公厅关于举办“第六届全国青少年民族乐器...

发布人:angelazhang 时间:2025-08-04 收藏
为了满足嵌入式系统的界面设计需求,给出了一种图形用户界面系统SKY-GUI的设计思路和其在嵌入式Linux环境下的实现方法。SKY-GUI有四大组成部分:输入抽象层、显示抽象层、事件系统和窗口系统。其特点是界面美观、占用资源少、运行效率高,现已应用于嵌入式视频监控项目。实验证明其设计思路可行,性能优良,适用于典型的嵌入式系统项目。

嵌入式图形用户界面(GUI, Graphic UserInterface)系统作为嵌入式系统中的一大关键技术,为用户提供设备的控制接口,其性能的好坏,界面的美观程度,影响着用户对产品的购买意愿和使用感受。

当前嵌入式系统中GUI的实现方式主要有两种:一是采用现有的GUI库;第二种是开发商基于嵌入式操作系统设计特有的GUI系统。采用第1种方式一般要对通用GUI库进行剪裁和个性化定制,也往往要支出额外的成本来获得软件授权。相对而言,第2种方法实现的GUI占用资源较小、容易满足嵌入式系统的实时性和个性化需求。

本文采用第2种方式,在嵌入式Linux下使用C语言实现了一个界面美观、轻量级、占用资源少、执行效率高的图形用户界面系统SKY-GUI.本文的结构如下:第1部分介绍SKY-GUI的基本结构;第2部分给出具体的模块设计;第3部分给出其实验和测试结果;最后总结。

1 SKY-GUI基本结构

SKY-GUI系统的功能主要有以下四点:

(1)接收各种输入设备的输入。

(2)建立消息循环,将设备的输入翻译为抽象的事件。

(3)建立窗口和控件对象系统,组织好各个抽象模块的关系,处理各种GUI事件。

(4)将GUI对象通过具体形状显示在屏幕上,通过动画将系统的状态变化呈现给用户。

基于这样的设计目标,SKY-GUI结构如图1所示。


图1 SKY-GUI的整体架构

它主要由输入抽象层、显示抽象层、事件系统和窗口系统四大部分组成。输入抽象层管理所有的输入设备,将用户的操作转化成消息送入事件系统。

显示抽象层操作显示设备,提供给窗口系统绘画、贴图、显示字体接口。事件系统为窗口系统提供消息获取、存储和处理的机制。窗口系统是SKY-GUI的核心,定义了各种控件和窗口,描述它们之间的逻辑关系和消息循环关系。下面将分别对这四大组成部分的设计进行介绍。

2 SKY-GUI模块设计

2. 1输入抽象层

输入抽象层为各种输入设备对事件系统的输入接口,它是一个单独的线程,其流程如图2所示。


图2输入抽象层流程。

输入抽象层首先对GUI所需的各种输入设备初始化,而后等待各个设备的输入。当接到设备输入,就把用户对设备的操作翻译成消息,送至事件系统最底层消息队列(在异2. 3. 2详细讨论)中。

设备输入的翻译过程根据具体的输入设备而定。对于键盘,只要将其键值和该键的状态封成消息。对于鼠标,除了要记录其按键状态,还要根据鼠标当前的位置和屏幕的大小将输入的位移分量转化成鼠标的新位置封入消息。

2. 2显示抽象层

显示抽象层的作用是为窗口系统提供显示接口函数,包括基本图形接口(画点、画线、填充矩形、区域拷贝、Alpha混合等)、贴图接口和字体接口三大功能,其结构如图3所示。


图3显示抽象层的结构。

显示抽象层在嵌入式Linux下的基础设备为帧缓冲,对其按坐标写入或读出颜色值即可实现基本的图形接口的功能。

简单的贴图功能用基本图形接口加bmp格式的文件(图片不经过压缩,其颜色分量按坐标顺序存储)就可以实现。为了让界面更加美观,SKY-GUI移植了开源的jpeg库和png库来解压相应格式的压缩图片文件,实现了对这两种图片格式的支持。

对字体的支持当然必不可少。点阵字体把字体的位图按12伊12、16伊16等格式存入二进制文件,可以比较容易地实现字体接口,但字体不能随意放大缩小,且放大后字体有明显的锯齿。矢量字体用数学方程加字形上的关键点来描述字体,可以进行无级缩放,为界面的绘制带来极大的灵活性。SKY-GUI移植了开源的Freetype库,用其寻址矢量字体文件并生成字体位图,实现了对矢量字体的支持。

2. 3事件系统

事件系统为SKY-GUI的其他三大部分提供消息发送、存储、获取和处理的功能。其核心为消息、消息队列和消息处理函数。

2. 3. 1消息定义

SKY-GUI的消息定义为:

typedef STruct __MSG {

HWND hWnd;摇/ /窗口指针

int event;摇/ /事件编号

void* wParam;摇/ /事件附加参数1

void* lParam;摇/ /事件附加参数2

} MSG;

百度 类似相关案例有过不少,还有些是未成年人花了巨额钱款打赏主播的。

hWnd为指向窗口的指针,表明此消息需要发给哪个窗口。event为事件编号,用不同的整数代表不同的事件。wParam和lParam为事件的附加参数,它们的含义根据事件类型的不同而定,例如,在鼠标消息中这两个参数就代表光标在屏幕上的坐标位置。

2. 3. 2消息队列

消息队列是事件系统中的消息的暂存处,它由一个环形先入先出结构的消息数组和一个消息链表组成。消息数组的空间是固定的,一旦被写满,后来的消息只好被丢弃;而消息链表则可以动态扩充大小。在SKY-GUI中,消息数组主要用来存放底层输入设备的事件(如鼠标、键盘、时钟等等),而消息链表主要用来存放优先级更高且不可丢弃的上层事件(窗口事件和显示事件)。

2. 3. 3消息操作接口

SKY-GUI定义了三类消息操作接口:消息发送函数、消息获取函数和事件处理函数。

消息发送函数为输入抽象层和窗口系统提供消息发送接口,包括Post_Msg函数和Send_Msg函数,其作用都是向消息队列发送消息,不同之处在于Post_Msg发送的消息存入消息队列的数组之中,而Send_Msg发送的消息则存入链表之中。

消息获取函数为Get_Msg函数,它为窗口提供取得消息的接口。拥有独立线程的窗口(异2. 4会描述其结构)调用它从消息队列中取得一个消息,其中存在链表中的消息更为重要,优先取出。

事件处理函数是窗口处理消息事件的函数接口,在SKY-GUI中,拥有独立线程的窗口调用Dispatch_Msg函数来实现对自己消息处理函数的调用。

2. 3. 4消息处理函数

Dispatch_Msg只是事件处理的调用接口,窗口收到消息后所采取的具体措施是由消息处理函数决定的,其定义为:

int WndProc(HWND hwnd, int event, void *wParam,void* lParam);

每一个窗口都有一个函数指针指向自己的消息处理函数,其功能根据不同的窗口有所不同,但总体结构是一样的,如图4所示。

538add07352b8-thumb.jpg

图4消息处理函数的结构

其本质上是一个消息处理的分类列表。当窗口调用消息处理函数时,其根据消息类型的不同分别调用底层输入消息、控件消息或显示消息的处理函数,而后再根据具体的消息事件调用相应的处理函数,实现对各种事件的响应。

2. 4窗口系统

窗口系统为SKY-GUI系统的核心,它维护了一个完整的窗口列表,定义了窗口系统和事件系统之间的关系,并制定了窗口之间的消息传递机制。

2. 4. 1窗口的定义

SKY-GUI中,窗口既包含桌面、对话框这种狭义的窗口,也包含窗口控件(如按钮、下拉菜单、编辑框等等)这样的广义窗口,其定义为:

typedef struct __WINDOW {

STR32 caption; / /窗口的名称

RECT rect; / /窗口的大小、位置

int style; / /窗口的类型

MsgQueue* pMsgQ; / /附属于窗口的消息队列

struct __WINDOW*pFocus; / /活动窗口指针

struct __WINDOW*pParent; / /父窗口指针

struct __WINDOW*pChldHead; / /子窗口列表

struct __WINDOW*pNext; / /兄弟窗口或控件指针

struct __WINDOW*pCtrlHead; / /控件列表

WNDPROC WndProc; / /消息处理函数指针

void* data1; / /窗口私有数据

void* data2; / /窗口私有数据

void* data3; / /窗口私有数据

int msg1; / /窗口状态变化消息

} WINDOW;

caption为窗口的名称;rect为保存窗口位置和大小的矩形;style为窗口的类型;pMsgQ为窗口的消息队列的指针;pFocus指向当前窗口的活动子窗口或控件;pParent指向当前窗口的父窗口;pNext指向当前窗口的兄弟窗口;pChldHead用来保存当前窗口的子窗口列表;pCtrlHead保存当前窗口的控件列表。WndProc指向当前窗口的消息处理函数;data1、data2、data3为窗口的私有数据,msg1为窗口状态变化时需要发出的控件消息,它们的意义根据窗口的类型而定。

从窗口的定义可以看出,本文要实现的是一种树形的窗口关系,整个系统可以拥有一个或多个主窗口,每个主窗口拥有自己的控件和子窗口,而子窗口又可以拥有各自的子窗口和控件,依此类推。

2. 4. 2窗口与消息队列的关系

窗口定义中含有指向消息队列的指针,但并不是所有的窗口都有自己的消息队列。主窗口(如桌面)需要随时呈现在用户的面前,可以拥有自己的消息队列;其他的子窗口、控件则没有必要拥有自己的消息队列。这两类窗口用不同的方式使用事件系统。

拥有消息队列的主窗口必须拥有自己独立的线程,其消息发送和处理的流程如图5所示。

538add3cbb3df-thumb.jpg

图5拥有消息队列的窗口的消息发送和处理流程。

当其他窗口或输入抽象层需要操作主窗口时,就调用事件系统中的Post_Msg或Send_Msg函数向该窗口的消息队列发送一个消息。而主窗口得知有消息输入,就调用事件系统中的Get_Msg函数取出消息,并使用Dispatch_Msg调用自己的消息处理函数,找到相应的事件处理方法处理事务。这种消息传递的特点是消息的发送和处理分别在不同的窗口线程中完成,一般用于两个主窗口之间或者输入抽象层和主窗口之间的消息通信。

没有消息队列的子窗口或控件处理消息的流程如图6所示。


图6没有消息队列的窗口的消息处理流程

主窗口调用事件系统中的Post_Msg或Send_Msg函数向子窗口或控件发送消息,由于该窗口没有自己的消息队列,事件系统不会将该消息保存,而是直接调用该窗口的消息处理函数找到具体的事件处理方式完成这次窗口操作。这种消息传递方式中,发送消息和处理消息都在主窗口的线程中完成,向一个窗口发送消息相当于要求该窗口立刻对事件进行处理。

SKY-GUI只设置了一个主窗口,即桌面。其他所有的窗口或对话框都作为桌面的子窗口而存在。

这样系统中只有一个窗口线程和一个消息队列,第一种消息处理方式只存在于输入抽象层和桌面之间,而窗口之间的消息处理都采用第二种方式,这样系统的线程开销和消息循环开销会大大减少,从而提高其运行效率。

2. 4. 3窗口之间的消息传递

窗口之间的消息传递根据消息类型的不同有两种不同方式。

主窗口从消息队列中取得的消息在SKY-GUI中称为底层消息。这类消息是由主窗口处理,还是交给子窗口或是控件处理,是根据窗口定义中的pFocus变量而定的。当一个窗口的pFocus不为空时,表示该窗口上方有子窗口被用户使用,消息应该交给它指向的子窗口处理,而这个子窗口也检查自己的pFocus变量,依此类推;只有当一个窗口的pFocus为空,表示该窗口位于屏幕的最上方,得到的底层消息由窗口自身处理(如图7左边流程)。

而当控件的状态变化产生控件消息时,其消息处理的过程正好跟上面的流程相反。控件产生的消息首先由自己处理,有必要时再送给pParent指针指向的父窗口处理,而后还有必要的话再送给父窗口的父窗口处理,最后也可以由主窗口送入消息队列(如图7右边流程)。


图7从消息队列读出的消息处理流程(左)和控件产生的消息处理流程(右)。

pFocus变量和pParent变量加上这样树形的窗口系统实质上是实现了很多GUI系统中的窗口的Z序[6](窗口的上下顺序)功能。该功能是建立在子窗口显示在其父窗口之上,且控件显示在其所属窗口之上的思想上的。由于底层消息一般代表用户对输入设备的操作,所以应该送给位于屏幕最上方的用户正在使用的窗口处理,而控件消息一般代表着GUI界面自上而下的图形和数据变化过程,所以应该从上到下逐层处理。

3实验和测试

SKY-GUI现已嵌入已有的视频监控系统项目中予以使用,它有下拉菜单、输入框、密码框、按钮、软键盘等十几种控件,提供视频监控的操控界面和配置界面。其中的一个典型的界面如图8所示。


图8 SKY-GUI在视频监控系统中的典型界面。

为了测试其的性能,本文利用SKY-GUI和开源的Qt界面库分别为视频监控系统制作了一套用户界面,其参数对比如表1所示。

表1 SKY-GUI与Qt在视频监控系统中的性能比较。


很显然,Qt在嵌入式监控系统中占用资源过多,导致其运行速度缓慢并影响到系统的正常编解码。

而SKY-GUI加上其所需的开源图片和字体库大小也不超过1 M,运行时只占用4 M左右的内存,这在典型的嵌入式Linux系统中完全可以接受,也不会影响到监控系统本身的性能。可以看出,Qt要运用在该监控系统中还需进行更深层次的剪裁和性能优化,而SKY-GUI则可满足其对界面的功能和性能需求。

4总结

本文描述了一种嵌入式Linux平台下GUI的设计方案。实验证明此设计方案可行,可以满足一般嵌入式平台上的图形界面要求。



评论

技术专区

碧玉是什么玉 电子烟是什么 线索细胞阳性什么意思 变色龙形容什么样的人 吃什么消除肺部结节
身上长湿疹是什么原因导致 糖五行属什么 公开遴选公务员是什么意思 铜绿假单胞菌用什么抗生素 痒是什么原因引起的
意有所指是什么意思 挖墙脚是什么意思 大便为什么是黑色的是什么原因 萎缩性胃炎吃什么药效果好 卵黄囊回声是什么意思
阳萎是什么 肾小球肾炎吃什么药 什么现象证明你在长高 宫颈管少量积液是什么意思 adhd是什么
拉肚子能吃什么hcv8jop8ns0r.cn 海鲜不能和什么一起吃hcv8jop1ns9r.cn 手足口病有什么症状hcv7jop9ns3r.cn 两个务必是什么hcv9jop8ns2r.cn 工业氧气和医用氧气有什么区别hcv7jop9ns5r.cn
占卜是什么意思hcv8jop8ns3r.cn 芒种是什么季节hcv7jop5ns1r.cn 大饼是什么意思hcv9jop7ns5r.cn 大腿根部痒用什么药膏hcv8jop3ns4r.cn 无名指为什么叫无名指hcv8jop4ns1r.cn
头顶一阵一阵疼是什么原因hcv9jop5ns7r.cn nfc果汁是什么意思hcv9jop8ns0r.cn okr是什么hcv8jop7ns1r.cn 亲故是什么意思hcv8jop5ns2r.cn 八字伏吟是什么意思hcv9jop3ns5r.cn
胃炎吃什么药hcv8jop6ns0r.cn 重庆古代叫什么sanhestory.com 金翅鸟吃什么hcv8jop2ns0r.cn 钡餐检查能查出什么hcv9jop3ns8r.cn 飞花令是什么hcv9jop5ns0r.cn
百度