搜索
bottom↓
回复: 14

关于文字刷新显示的问题

[复制链接]

出0入0汤圆

发表于 2011-1-17 14:31:00 | 显示全部楼层 |阅读模式
在一个项目里,需要再界面上显示经常刷新的信息,按照例子里的方法,屏幕上会产生闪烁的感觉,原因是在显示新信息时,要先清空原来位置上的图像,然后再显示新的内容,由于速度的原因,这样就会在屏幕上产生闪烁的效果,如下面的程序,
dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view));
if (dc == RT_NULL) return ;
rt_snprintf(line, sizeof(line), "%d年%02d月%02d日 %02d时%02d分%02d秒",ti->tm_year+1900,ti->tm_mon+1,ti->tm_mday, ti->tm_hour,ti->tm_min,ti-  >tm_sec);
rect.x1 = 580;
rect.y1 = 16;
rect.x2 = rect.x1+220;
rect.y2 = rect.y1 + 16;

saved = RTGUI_DC_BC(dc);
RTGUI_DC_BC(dc) = RTGUI_RGB(255, 255, 255);
rtgui_dc_fill_rect(dc, &rect);
rtgui_dc_draw_text(dc, line, &rect);//就是这句话产生了闪烁
RTGUI_DC_BC(dc) = saved;

rtgui_dc_end_drawing(dc);

其实文字也是图片,需要显示的地方为1,不显示的地方为0,这样在显示时,为1的地方用前景色显示,为0的地方用背景色显示,同时屏蔽掉rtgui_dc_fill_rect(dc, &rect);
这句话,就可以达到不闪烁的效果。
static void rtgui_dc_hw_draw_bc_point(struct rtgui_dc* self, int x, int y)
{
        struct rtgui_dc_hw* dc;
        rtgui_rect_t rect;

        dc = (struct rtgui_dc_hw*)self;
        if (dc == RT_NULL || dc->visible != RT_TRUE) return;

        x = x + dc->owner->extent.x1;
        y = y + dc->owner->extent.y1;

        if (rtgui_region_contains_point(&(dc->owner->clip), x, y, &rect) == RT_EOK)
        {
                /* draw this point */
                dc->device->set_pixel(&(dc->owner->gc.background), x, y);
        }
}

(原文件名:1.jpg)


(原文件名:2.jpg)


(原文件名:3.jpg)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-1-17 14:43:38 | 显示全部楼层
给力!

出0入0汤圆

 楼主| 发表于 2011-1-17 14:48:01 | 显示全部楼层
用的是radio的板子,自己接了个群创7寸屏,感觉整套的显示速度还可以,操作起来也不觉得慢,原来的屏幕小了点,显示的信息太少,下一步准备接个10寸的屏玩玩。

出0入0汤圆

发表于 2011-1-17 14:51:03 | 显示全部楼层
很不错啊
关键是CPU处理速度,
觉得stm32F1XXX对GUI来说,还是慢了点

出0入0汤圆

发表于 2011-1-17 15:03:44 | 显示全部楼层
不错,感觉屏幕很大啊

出0入0汤圆

 楼主| 发表于 2011-1-17 15:11:38 | 显示全部楼层
是800X480的分辨率,基本够用了,就是字体小了点,不知道如何换成字体大些的文字,比如32X32的,这样看起来更专业些。

出0入0汤圆

发表于 2011-1-17 16:00:18 | 显示全部楼层
真不错啊。

出0入0汤圆

发表于 2011-1-17 16:46:23 | 显示全部楼层
是不是一般操作系统像windows类的都是这种实现方式?画点都是只画前景?这样的话就可以实现在图片上再显示一些文字。

出0入0汤圆

 楼主| 发表于 2011-1-17 16:58:18 | 显示全部楼层
如果只画前景,那么多画几次后,就是一团看不清的图像了,对后景还是要处理下才好吧。

出0入0汤圆

发表于 2011-1-17 17:25:35 | 显示全部楼层
所以才要fill一下,速度慢了就闪了,没办法,不过如果背景色只是纯色的话,你要想实现前景背景一块画,改改
void rtgui_bitmap_font_draw_char(struct rtgui_font_bitmap* font, struct rtgui_dc* dc, const char ch,        rtgui_rect_t* rect)
就行了吧,里边只有一个画前点的if语句,你再加一个else就行了。不是还有一个画指定颜色点的函数吗
rt_inline void rtgui_dc_draw_color_point(struct rtgui_dc* dc, int x, int y, rtgui_color_t color).

出0入0汤圆

发表于 2011-1-17 17:31:03 | 显示全部楼层
是的,在else里画背景色就可以解决这个问题,可能考虑加一个gc选项来指定需要画背景色

出0入0汤圆

发表于 2011-1-17 19:45:13 | 显示全部楼层
恩,这个注意好!在一般控制应用里,界面比较单纯,在cpu速度受限制的情况下,前背景一块画会改善视觉效果。

出0入0汤圆

发表于 2011-1-17 20:18:46 | 显示全部楼层
工作状态和停机原因都显示出来就更好了,哈哈.

出0入0汤圆

发表于 2011-4-17 21:54:31 | 显示全部楼层
做的不错呀,我也在玩7寸的。

出0入12汤圆

发表于 2011-10-27 14:08:56 | 显示全部楼层
回复【10楼】ffxz  
是的,在else里画背景色就可以解决这个问题,可能考虑加一个gc选项来指定需要画背景色
-----------------------------------------------------------------------

如果有个label可以显示10位数字,背景为黑色,前景为白色,显示方式居左。定时刷新时,位数是变花的,这时显示就乱了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 10:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表