嵌入式学习小组
直播中

周芳卿

7年用户 131经验值
私信 关注

为什么gui刷对话框慢刷对话框上的控件速度正常?

用guibuilder创建的一个对话框,显示对话框的时候上面的控件一下就显示出来了,但是对话框是从上面慢慢的刷下来,请问这是怎么回事呢?

回帖(12)

韩香茹

2019-8-27 07:05:45
μ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会适当的降低了液晶屏重绘的速度,但应该不会影响太多。。。。。
举报

李锰

2019-8-27 07:23:05
只是你的个例吗?
举报

王强

2019-8-27 07:40:44
说明你的底层液晶屏操作的代码不优化,由于对话框占据的区域比较大,所以填充起来比较慢
你可以写一个简单的填充液晶屏全部区域的程序,更换不同的颜色,看看刷一次屏幕需要多长时间
举报

郭楚

2019-8-27 07:53:01
我按照你的方法测试了填充液晶,感觉速度是很快的。已经把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();
  }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分