Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
揭秘RTGUI组件
发布于 2009-08-09 09:10:11 浏览:12560
订阅该版
RTGUI很快会进入beta版的发布周期,所以很有必要仔细的谈谈RTGUI的内部实现。 GUI实现的借鉴无疑是很重要的,在实现RTGUI的过程中借鉴了一些开源的代码,以下是涉及到的开源项目,有些是借鉴了它的思想,有些是借鉴了它的代码: - cairo中的pixman组件(实现快速的区域剪切算法) - LGUI - etk from Enlightenment项目 使用到的第三方图形库(可选) - libpng - libjpeg - libz 下载附件 [rtgui_picture.zip](https://oss-club.rt-thread.org/uploads/53_fec4c8c53537768148cf78fd881a977a.zip) 下载附件 [hdc_viewer.zip](https://oss-club.rt-thread.org/uploads/53_a748f231f1b7c806c13bb8b2e1cbf922.zip)
查看更多
14
个回答
默认排序
按发布时间排序
bernard
2009-08-11
这家伙很懒,什么也没写!
现代的GUI一般会有如下几个特点: - Alpha透明模式,因为外观看起来酷; - 圆角窗口,物体不再呆板; - 大多采用C++或更高级的语言编程。 很抱歉,目前RTGUI这些都做不到。要做窗口之间的Alpha透明,需要的计算量比较大,而且跨越的东西也比较多。圆角窗口,同上!这些都是RTGUI目前做不到的。 C++,在嵌入式系统里用起来太复杂了,全局对象在系统启动的时候就需要做自动的对象构造。所以还是继续采用C吧(面向对象风格C编程): ``` #include
#include
/** Gets the type of a button */ #define RTGUI_LABEL_TYPE (rtgui_label_type_get()) /** Casts the object to an rtgui_button */ #define RTGUI_LABEL(obj) (RTGUI_OBJECT_CAST((obj), RTGUI_LABEL_TYPE, rtgui_label_t)) /** Checks if the object is an rtgui_button */ #define RTGUI_IS_LABEL(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_LABEL_TYPE)) /* * the label widget */ struct rtgui_label { struct rtgui_widget parent; /* label */ unsigned char* text; }; typedef struct rtgui_label rtgui_label_t; rtgui_type_t *rtgui_label_type_get(void); rtgui_label_t* rtgui_label_create(const unsigned char* text); void rtgui_label_destroy(rtgui_label_t* label); rt_bool_t rtgui_label_event_handler(struct rtgui_widget* widget, struct rtgui_event* event); void rtgui_label_set_text(rtgui_label_t* label, const unsigned char* text); unsigned char* rtgui_label_get_text(rtgui_label_t* label); ``` 这个是一个label控件的定义,它从rtgui_widget类继承而来。可以发现它和以前RT-Thread的面向对象编程有少许不一样了。 1. 类型。原来的代码中RT-Thread是不保留类型的数据结构的。而这里可以通过rtgui_label_type_get函数或宏获RTGUI_LABEL_TYPE得一个label的rtgui_type_t结构定义。 2. 一个对象是否是label类型?宏RTGUI_IS_LABEL给出了这个判断,其实现也正是基于新引入的类型机制:每一个RTGUI对象都会有一个它所属的类型结构体指针,指明它是哪种类型,并给出派生关系。 3. 事件处理。一个控件显式的(没办法实现友元的折中)给出了它的事件处理函数:rtgui_label_event_handler。RTGUI的控件库是基于事件处理的,所以一个控件如果想要实现自定义的外观,很简单:直接处理绘图事件或重载ondraw虚拟函数就可以了。 思想来源:etk from enlightenment
bernard
2009-08-20
这家伙很懒,什么也没写!
基本的绘图操作 绘图操作都是依赖于一个设备上下文的,例如直接显示用的硬件设备上下文(dc_hw),缓冲用的设备上下文(dc_buffer)。在此上下文环境下,可以进行基本的绘图操作: - rtgui_dc_draw_point 在dc上下文上绘制一个点; - rtgui_dc_draw_vline 在dc上下文上绘制一条垂直线; - rtgui_dc_draw_hline 在dc上下文上绘制一条水平线; - rtgui_dc_draw_line 在dc上下文上绘制一条斜线; - rtgui_dc_draw_rect 在dc上下文上绘制一个矩形框; - rtgui_dc_fill_rect 在dc上下文上填充一个矩形框; - rtgui_dc_draw_text 在dc上下文上绘制字符串; - rtgui_dc_draw_polygon 在dc上下文上绘制多边形; - rtgui_dc_fill_polygon 在dc上下文填充多边形; 等。 依赖于RTGUI的对象编程,只需要指定不同的DC对象即能实现不同的绘图,支持AA的绘图正在添加中。
bernard
2009-08-20
这家伙很懒,什么也没写!
RTGUI的图像格式支持 这里说的并不是对图像进行变换操作,而是最基本的图像支持。RTGUI默认支持如下图像格式: - xpm,从X-Server而来的图标格式,容易嵌入到代码中,完全的图像数据C语言数组。 - png,支持透明通道的图像格式; - bmp,非压缩的图像格式,在MS Windows中开始使用; - jpeg,压缩的有损图像格式。 以上这些是RTGUI默认支持的图像格式,可以根据具体情况进行剪裁,只支持一种或全部都支持。其中png使用的是libpng库,连带的需要使用libz库。jpeg使用jpeg 7库。这些库应该说都是广为使用的,有些做得非常不错,剪裁容易,例如libpng。而jpeg则剪裁少些,例如想只要解码功能,不是有编码功能,需要对代码有初步的了解才能修改代码做剪裁。而libpng只需要宏切换即可。 各个图像格式都是派生于rtgui_image类,在初始化、创建时,它都会读取文件头信息(假设是解码,默认不支持编码),但并不把所有文件内容都载入进去(xpm图像格式是一个例外)。而当需要blt一个图像到一个dc设备时,此时才真正做图像数据的读取或解码,这样虽然可能速度会牺牲一些(当然可以指定预读取),但内存使用上会好一些。总之,速度与内存之间,是一个折中,可以通过API指定具体行为。 JPEG使用例子: /* 创建一个image对象 */ struct rtgui_image* jpeg = rtgui_image_create_jpeg("d://test.jpg", RT_TRUE); rtgui_image_create_jpeg返回的是一个image对象,第一个参数是jpeg的文件名。 第二个参数,如果是RT_TRUE,图像将被一次性的载入到内存中进行解码;如果是RT_FALSE,图像将在需要绘制的时候才载入到内存中进行解码。 /* 在绘图时,直接绘制在DC上(可以是一个硬件DC,也可以是一个缓冲DC) */ rtgui_image_blit(jpeg, dc, &rect); 参数dc即目标DC rect为目标矩形区域 例如针对一个view对象而言,可以用如下代码 rt_bool_t view_ondraw(struct rtgui_widget* widget) /* 入口参数应该为一个可绘图控件 */ { struct rtgui_dc* dc; struct rtgui_rect rect; dc = rtgui_dc_begin_drawing(widget); /* 开始一个DC的绘图,此处是一个硬件DC */ if (dc == RT_NULL) return RT_FALSE; rtgui_widget_get_rect(widget, &rect); /* 获得控件的外观矩形大小 */ if (jpeg != RT_NULL) rtgui_image_blit(jpeg, dc, &rect); /* 在目标DC的矩形区域上绘制图像 */ rtgui_dc_end_drawing(dc); /* 绘图完成 */ return RT_FALSE; } PNG图像的API只有在创建image对象时名称上不同,参数、使用方法上则相同。
bernard
2009-10-16
这家伙很懒,什么也没写!
RTGUI的代码已经放到google svn里了,暂时缺少文档,欢迎大家提出宝贵的建议。 RTGUI的代码是和RT-Thread完全耦合在一起的,所以在没得到官方授权的情况下,请不要移植到RT-Thread以外的其他平台。RTGUI得益于RT-Thread的线程机制,可运用于RT-Thread的多线程显示中。
bernard
2009-11-11
这家伙很懒,什么也没写!
RTGUI新添加自有HDC图像格式支持: HDC是与设备紧密相耦合的图像格式,相当于可以直接贴到硬件设备上,而不需要解压缩。 以后考虑支持透明色 和 多画面层叠以实现动画。 HDC图像格式的特点非常显著: 1、速度快,采样底层驱动绘raw水平线方式绘制。 2、内存省,对于一幅320x240的图片(16位色TFT设备),只需要512+字节实现绘图。
LEAN
2009-11-11
这家伙很懒,什么也没写!
>RTGUI新添加自有HDC图像格式支持: >HDC是与设备紧密相耦合的图像格式,相当于可以直接贴到硬件设备上,而不需要解压缩。 > >以后考虑支持透明色 和 多画面层叠以实现动画。 > >HDC图像格式的特点非常显著: >1、速度快,采样底层驱动绘raw水平线方式绘制。 >2、内存省,对于一幅320x240的图片(16位色TFT设备),只需要512+字节实现绘图。 --- [s:154] 又有增强啦
bernard
2009-11-12
这家伙很懒,什么也没写!
添加splay tree实现的中文字体缓存支持: - 字体文件可选的,可放于SD卡文件上或作为C数组形式编到代码中。 - 中文字体文件自动做一个缓存(用的FreeBSD的splay tree实现),当要取字体信息时,先从cache中load,如果cache不存在再到文件中load到cache上。使用splay tree的好处是,查找速度比较合理,同时最近使用的离根节点更近,下次查找当然也就更快了。当cache满了以后,则从最底层的叶子节点删除节点项。 目前做的一个STM32F107的demo,包含的功能: - RT-Thread及组件简介 - 文件浏览 (*) - 波形显示的 演示 - 显示设备信息(芯片、内存使用情况、线程数、IP地址) 组件总计包括:Kernel、File System、FinSH shell、RTGUI 编译时大约占用静态15K内存,运行起来后(包括所有的图形功能),内存最大占用是26K,当前内存占用时24K。 所以,这样估计的话,64K SRAM的STM32应该能够足够运行RTT Kernel, FileSystem, LwIP, RTGUI了。紧张些,48K SRAM也可以。 (*) 文件浏览还没加上运行,加了,会多出一些内存占用,但应该不会太多。
xinyang666
2009-11-27
这家伙很懒,什么也没写!
非常关注,不过没有文档,有点看不明白。
bernard
2009-12-23
这家伙很懒,什么也没写!
STM32F103ZE,FSMC接的LCD,未用外扩SRAM 文件都是从SD卡中读取,然后做渲染
ljt8015
2009-12-25
这家伙很懒,什么也没写!
RTGUI组件文档资料 什么时候出来啊 ?
撰写答案
登录
注册新账号
关注者
0
被浏览
12.6k
关于作者
bernard
这家伙很懒,什么也没写!
提问
414
回答
5940
被采纳
76
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部