|
在一个项目里,需要再界面上显示经常刷新的信息,按照例子里的方法,屏幕上会产生闪烁的感觉,原因是在显示新信息时,要先清空原来位置上的图像,然后再显示新的内容,由于速度的原因,这样就会在屏幕上产生闪烁的效果,如下面的程序,
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周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|