OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7052|回复: 12

gui刷对话框慢刷对话框上的控件速度正常

[复制链接]

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2013-11-1
在线时间
8 小时
发表于 2014-8-6 11:16:03 | 显示全部楼层 |阅读模式
5金钱
用guibuilder创建的一个对话框,显示对话框的时候上面的控件一下就显示出来了,但是对话框是从上面慢慢的刷下来,请问这是怎么回事呢?

最佳答案

查看完整内容[请看2#楼]

μc/gui中重绘是单独在一起的,是由GUI_Exec();函数中的WM_Exec();函数中的_DrawNext();函数向各个窗口(或控件)发送WM_PAINT重绘类型消息,这些窗口(控件)的系统级回调函数接收到该消息,调用它们的_Paint();函数(该函数为static类型的函数,属于私有类型)绘制自己的控件。。。 GUI_CreateDialogBox();函数只是创建窗口,对于那些需要显示的窗口(创建窗口(控件)时设置了WM_SF_ISVIS属性的窗口)将调用WM_ShowWindow();函 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2014-8-6 11:16:04 | 显示全部楼层
μc/gui中重绘是单独在一起的,是由GUI_Exec();函数中的WM_Exec();函数中的_DrawNext();函数向各个窗口(或控件)发送WM_PAINT重绘类型消息,这些窗口(控件)的系统级回调函数接收到该消息,调用它们的_Paint();函数(该函数为static类型的函数,属于私有类型)绘制自己的控件。。。

GUI_CreateDialogBox();函数只是创建窗口,对于那些需要显示的窗口(创建窗口(控件)时设置了WM_SF_ISVIS属性的窗口)将调用WM_ShowWindow();函数设置窗口所在区域为无效区域,从而与该无效区域交叉的窗口都将被设置为无效窗口,但并不涉及绘制的内容
WM_ShowWindow();函数是将一个窗口设置为无效窗口(修改窗口的无效属性、修改窗口的无效矩形实现的),从而表示该窗口是一个需要显示的窗口,因而也不涉及绘制内容

WM_Exec();函数在执行时将会从以桌面窗口为根的窗口树上遍历所有需要重绘的窗口,如上所述,发送WM_PAINT消息,通知这些窗口进行重绘

因而,用户编写GUI程序时,必须要有一个函数不停的调用GUI_Exec();函数或者WM_Exec();函数完成重绘操作
添加操作系统的可以建立一个如下任务
while(1)
{
  GUI_Exec();       //重绘所有需要重绘的窗口
  Os_Dly_ms(20); //执行操作系统调度并延时,如果20ms时间太长可以稍微剪短
}
不带操作系统的需要有
while(1){
  GUI_Exec();
}
在GUI中GUI_Delay();函数中包含了GUI_Exec();函数,所以不带操作系统的也可以换成如下代码执行重绘
while(1)
  GUI_Delay(20);  //延时20ms并且重绘

有一个名字叫做GUI_ExecCreateDialogBox();的函数(名字可能有误,就是大家利用GUIBuilder建立的对话框时使用的那个函数),在该函数中调用GUI_CreateDialogBox();函数创建一个对话框,并且在while循环中调用GUI_Exec();函数进行GUI的重绘,while循环在对话框被关闭后才退出,所以利用该函数建立的对话框又称为阻塞型对话框

这些属于GUI的原理部分,但可能与楼主遇到的问题没有关系,添加了GUI会适当的降低了液晶屏重绘的速度,但应该不会影响太多。。。。。
努力,前进。
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-8-6 12:05:52 | 显示全部楼层
只是你的个例吗?
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2014-8-6 15:01:34 | 显示全部楼层
说明你的底层液晶屏操作的代码不优化,由于对话框占据的区域比较大,所以填充起来比较慢

你可以写一个简单的填充液晶屏全部区域的程序,更换不同的颜色,看看刷一次屏幕需要多长时间
努力,前进。
回复

使用道具 举报

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2013-11-1
在线时间
8 小时
 楼主| 发表于 2014-8-6 16:18:16 | 显示全部楼层
回复【3楼】5498折戟沉沙:
---------------------------------
我按照你的方法测试了填充液晶,感觉速度是很快的。已经把LCD_L0_FillRect函数直接改成填充的。但是如果不用DIALOG的话刷新还是很快的。用上之后就刷新dialog会很慢。跟踪GUI_CreateDialogBox函数里面调用了WM_ShowWindow函数显示,但是WM_ShowWindow函数怎样调用底层液晶程序就不知道在哪条语句了。请大哥给我解释下吧。
WM_HWIN GUI_CreateDialogBox(const GUI_WIDGET_CREATE_INFO* paWidget, int NumWidgets, WM_CALLBACK* cb, WM_HWIN hParent,
                            int x0, int y0)
{
  WM_HWIN hDialog = paWidget->pfCreateIndirect(paWidget, hParent, x0, y0, cb);     /* Create parent window */
  WM_HWIN hDialogClient = WM_GetClientWindow(hDialog);
  WIDGET_OrState(hDialog, paWidget->Flags);
  WM_ShowWindow(hDialog);
  WM_ShowWindow(hDialogClient);
  while (--NumWidgets > 0) {
    WM_HWIN hChild;
    paWidget++;
    hChild = paWidget->pfCreateIndirect(paWidget, hDialogClient, 0, 0, 0);     /* Create child window */
    WM_ShowWindow(hChild);
  }
  WM_SetFocusOnNextChild(hDialog);     /* Set the focus to the first child */
  WM_SendMessageNoPara(hDialogClient, WM_INIT_DIALOG);
  return hDialog;
}



void WM_ShowWindow(WM_HWIN hWin) {
  if (hWin) {
    WM_Obj *pWin;
    WM_LOCK();
    pWin = WM_H2P(hWin);  
    if ((pWin->Status & WM_SF_ISVIS) == 0) {  /* First check if this is necessary at all */
      pWin->Status |= WM_SF_ISVIS;  /* Set Visibility flag */
      WM_InvalidateWindowDescs(hWin);    /* Mark content as invalid */
      #if WM_SUPPORT_NOTIFY_VIS_CHANGED
        WM__NotifyVisChanged(hWin, &pWin->Rect);
      #endif
    }
    WM_UNLOCK();
  }
}
回复

使用道具 举报

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2013-11-1
在线时间
8 小时
 楼主| 发表于 2014-8-6 19:33:46 | 显示全部楼层
分析得很好,谢谢。先找下资料优化底层!请问优化的话对液晶的底层进行优化,那ucgui还有没有哪些地方要优化的呢。已经优化了一个填充函数。或者有没有什么好的资料可以提供给小弟呢?
回复

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2014-8-6 22:00:55 | 显示全部楼层
回复【6楼】几世繁华:
---------------------------------
简单的优化可以使用LCD存储设备,即为每一个新建的窗口、控件都添加WM_SF_MEMDEV属性

复杂的优化需要借助更加NB的液晶屏,这些液晶屏本身的读写速度比较快,而且支持一些比较复杂的操作,譬如直接移动液晶屏上的一些区域到另外一个区域。。。

资料,现在没有现成的资料。不过,本人一直在整理自己之前对GUI的理解,准备整理成册,会对GUI的运行原理、应用开发做详细的介绍,现在正在进行中,短则一个月就能完成....

一直在开源电子网解答GUI相关的内容,论坛中也有一些网友会解答,欢迎来关注。
努力,前进。
回复

使用道具 举报

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2013-11-1
在线时间
8 小时
 楼主| 发表于 2014-8-6 22:15:36 | 显示全部楼层
谢版主大哥,自己再试试
回复

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2014-12-5
在线时间
2 小时
发表于 2014-12-5 15:17:07 | 显示全部楼层
回复【6楼】几世繁华:
---------------------------------
我也碰到了哦,是底层的问题呢!
还有一个画横线函数要优化:
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {
LCD_SetWindow(x, y,x+xsize,y ); //ili9488 only  设定坐标范围:左上角,右下角
LCDWriteReg(0x2C);      //Write data 
for (;xsize > 0; xsize--,p++)                            //写颜色
                LCDWriteData(*p);
         
// for (;xsize > 0; xsize--, x++, p++) {             //未优化的画线函数
// _SetPixelIndex(pDevice, x, y, *p);
// }
}
回复

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2014-12-5
在线时间
2 小时
发表于 2014-12-5 15:18:49 | 显示全部楼层
回复【9楼】大阿哥:
---------------------------------
刚注册的账号回答你的问题  嘿嘿!
回复

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2014-12-5
在线时间
2 小时
发表于 2014-12-5 15:20:13 | 显示全部楼层
回复【6楼】几世繁华:
---------------------------------
刚注册的账号回答你的问题  嘿嘿
回复

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2016-6-3
在线时间
25 小时
发表于 2016-7-13 08:49:28 | 显示全部楼层
【能接emWin的SPI串口屏】
GLCD功能类似于SPI串口屏,只是SPI接口通信更快速,以至能作为emWin(第三方界面软件库)的图形显示屏,弥补emWin使用字库/图片麻烦以及刷屏慢的缺点,这样emWin做界面就更精美、便捷!
emWin界面软件库是运行在用户CPU中的;GLCD负责储存字库和图片,以及接收由emWin发出的绘图指令,并且执行这些绘图指令以显示文字、图片、2D图形等,绘图指令代替像素操作可大大减轻用户CPU的负担;GLCD还管理触摸屏、鼠标、键盘、蜂鸣器、RTC时钟等外设。
更多介绍请看:www.neqee.com
回复

使用道具 举报

20

主题

143

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-8-28
在线时间
108 小时
发表于 2017-1-9 19:16:33 | 显示全部楼层
楼主解决没?我开了一个10ms定时器中断,里面执行GUI_TOUCH_Exec(); 我的带触摸功能!测试时,只操作一个鼠标时,触笔点到哪里,鼠标就到哪里。正确无误。但是添加上ucguibuilder生成的代码后,执行GUI_ExecDialogBox(),一切都不能工作了。定时器中断执行都错误了。求大神指点指点
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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