硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4453|回复: 5
收起左侧

[emWin] emwin 仪表盘显示有撕裂现象

[复制链接]

10

主题

46

回帖

76

积分

初级会员

积分
76
发表于 2020-12-9 17:12:27 | 显示全部楼层 |阅读模式
问题如题,刷新显示的时候屏乱闪。感觉指针刷新和文本更新有冲突,还请各位大神帮忙分析一下原因。主要代码如下:

/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
        { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 800, 480, 0, 0x0, 0 },
  { PROGBAR_CreateIndirect, "Progbar", ID_PROGBAR_0, 363, 31, 20, 98, 1, 0x0, 0 },
  { PROGBAR_CreateIndirect, "Progbar", ID_PROGBAR_1, 416, 31, 20, 95, 1, 0x0, 0 },
  { TEXT_CreateIndirect, "Throtle", ID_TEXT_0, 346, 136, 54, 20, 0, 0x64, 0 },
  { TEXT_CreateIndirect, "Speed", ID_TEXT_1, 140, 225, 146, 99, 0, 0x64, 0 },
  { TEXT_CreateIndirect, "RPM", ID_TEXT_2, 520, 225, 155, 87, 0, 0x64, 0 },
  { TEXT_CreateIndirect, "Brake", ID_TEXT_3, 415, 135, 52, 20, 0, 0x64, 0 },
  { TEXT_CreateIndirect, "Time", ID_TEXT_4, 365, 385, 80, 20, 0, 0x64, 0 },
  // USER START (Optionally insert additional widgets)
  // USER END
};



/*********************************************************************
*
*       _cbDialog
*/
static void _cbDialog(WM_MESSAGE * pMsg) {
  WM_HWIN hItem;
  // USER START (Optionally insert additional variables)
  GUI_AUTODEV AutoDev;      /* 内存设备 */
  PARAM       Param;        /* PARAM类型变量 */
  char TextSpeed[16];
  char TextRpm[16];


  static int                 t_Count0 = 0;// -a by Trun 20200311
  static int                 t_Count1 = 0;// -a by Trun 20200311
  static int                 t_Count2 = 0;// -a by Trun 20200311
  static int         t0 = 360;   /* 用于三个指针的计数 */
  static int         t1 = 360;
  static int         t2 = 360;
  static int         Dir0 = 1;
  static int         Dir1 = 1;
  // USER END


  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:


          hItem = WM_GetDialogItem(pMsg->hWin, ID_PROGBAR_0);
          PROGBAR_SetBarColor(hItem, 0, GUI_BLUE);
          PROGBAR_SetBarColor(hItem, 1, GUI_ORANGE);


          hItem = WM_GetDialogItem(pMsg->hWin, ID_PROGBAR_1);
          PROGBAR_SetBarColor(hItem, 0, GUI_BLUE);
          PROGBAR_SetBarColor(hItem, 1, GUI_ORANGE);
    //
    // Initialization of 'Text'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
        hText[0] = hItem;
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
    TEXT_SetFont(hItem, GUI_FONT_D24X32);
    TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00C08080));
    //
    // Initialization of 'Text'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_2);
        hText[1] = hItem;
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
    TEXT_SetFont(hItem, GUI_FONT_D24X32);
    TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00C08080));
    //
    // Initialization of 'Text'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_4);
    hText[2] = hItem;
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
    TEXT_SetFont(hItem, GUI_FONT_8X16_1);
    TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00C0C0C0));
    // USER START (Optionally insert additional code for further widget initialization)
        /* 使能抗锯齿 */
        GUI_AA_EnableHiRes();
        /* 设置抗锯齿因数 */
        GUI_AA_SetFactor(MAG);
        /* 创建自动设备对象 */
        GUI_MEMDEV_CreateAuto(&AutoDev);
    // USER END
    break;
  // USER START (Optionally insert additional message handling)
  // USER END
        /* 重绘消息 */
  case WM_PAINT:
          /* 第一个指针计数,用于旋转速度 */
          t0-= 10;
          if (t0< 0)
          {
                  t0 = 36000;
          }

          /* 第二个指针计数,用于旋转速度 */
          t1 -= 10;
          if (t1 < 0)
          {
                  t1 = 36000;
          }
          /* 旋转第一个指针 */
          Param.Angle = t0;
          Param.Angle *= 3.1415926f / 18000;
          GUI_RotatePolygon(Param.aPoints, _aNeedle, countof(_aNeedle), Param.Angle);


          /* 旋转第二个指针 */
          Param.Angle1 = t1;
          Param.Angle1 *= 3.1415926f / 18000;
          GUI_RotatePolygon(Param.aPoints1, _aNeedle1, countof(_aNeedle1), Param.Angle1);


          GUI_MEMDEV_DrawAuto(&AutoDev, &Param.AutoDevInfo, &_Draw, &Param);


          //更新文本显示
          sprintf((char*)TextSpeed, "%d", (t0 + 12000) / 100);
          sprintf((char*)TextRpm, "%d", t1 / 100);
          TEXT_SetText(hText[0], TextSpeed);
          TEXT_SetText(hText[1], TextRpm);
          break;
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}


/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       CreateWindow
*/
WM_HWIN CreateWindow(void);
WM_HWIN CreateWindow(void) {
  WM_HWIN hWin;


  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWin;
}



/*
*********************************************************************************************************
*        函 数 名: MainTask
*        功能说明: GUI主函数
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void MainTask(void)
{
        GUI_Init();
        WM_MULTIBUF_Enable(1);                        //开启STemWin多缓冲,RGB屏可能会用到


        while (1)
        {
                CreateWindow();
                GUI_Delay(100);
        }
}



显示异常.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2020-12-9 19:05:11 | 显示全部楼层
直接跑我这个时钟表盘的例子是否正常

【年末福利】F429开发板12期emWin提高篇实战例程发布,含音视频播放器,uCOS-III和FreeRTOS两个版本
http://www.armbbs.cn/forum.php?m ... 3687&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

11

主题

130

回帖

168

积分

初级会员

积分
168
发表于 2020-12-9 19:51:06 | 显示全部楼层
while (1)
{
     CreateWindow();
     GUI_Delay(100);
}
这代码逻辑不对呀。不断的创建新窗口,然后新窗口更新表盘指针位置。还好是模拟器,实际下到板子上很快就挂了吧。
窗口只创建一次,刷新由定时器触发。建议先看看论坛里的emwin资料。
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2020-12-10 08:34:07 | 显示全部楼层
eric2013 发表于 2020-12-9 19:05
直接跑我这个时钟表盘的例子是否正常

【年末福利】F429开发板12期emWin提高篇实战例程发布,含音视频播 ...

谢谢,是我没把例程完全看懂,现在已经解决了。
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2020-12-10 08:35:31 | 显示全部楼层
有梦为马 发表于 2020-12-9 19:51
while (1)
{
     CreateWindow();

仔细研究例程,其实比较简单,没理解透例程,问题复杂化了。谢谢了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2020-12-10 10:47:08 | 显示全部楼层
zhoutao318 发表于 2020-12-10 08:34
谢谢,是我没把例程完全看懂,现在已经解决了。

好的,后面还有什么问题,再交流。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-20 00:41 , Processed in 0.245005 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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