硬汉嵌入式论坛

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

[emWin] 求助帖,emwin显示图片闪烁

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2019-12-5 19:20:02 | 显示全部楼层 |阅读模式
求助论坛大佬,现在使用的是新塘的n9h20,利用emwin进行刷图操作,图片从右往左移动(类似动画的现过),并且在图片上显示相关的信息(同样是显示图片的),现在出现的情况是,显示的相关信息会出现闪烁(不是一直闪烁),但是动画效果图没问题(开启定时器,在回调函数中定时刷新),很奇怪一直没找到原因,刷图时使用了双缓冲(驱动是原厂给的应该没什么问题)。下面是程序的框架,请大佬帮忙看下那边是否有问题,感激不尽!


static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 272, 480, 0, 0, 0 },
{ IMAGE_CreateIndirect, "Image", ID_IMAGE_0, 0, 0, 272, 480, 0, IMAGE_CF_MEMDEV, 0 },
};

static void _cbDialog(WM_MESSAGE * pMsg) {
WM_HWIN hItem;
static unsigned char count_open= 0;
switch (pMsg->MsgId) {
case WM_INIT_DIALOG://?????,????/?????,????????????????
  hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);

  break;

case WM_TIMER://?????,??????
  WM_RestartTimer(hTimer6, 125);
  GUI_MULTIBUF_Begin();

   Load_Sonar_picture();//加载图片信息
   Load_Sonar_Strength();//
   Update_Fish_Image();//

  WM_SelectWindow(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0));
  GUI_DrawBitmapMag(&SonarImage, 0, 0,1,2);//绘制动画图片
  GUI_DrawBitmapMag(&Signal, 248, 0,1,2);//

   GUI_DrawBitmap(&bmruler, 237, 0);//
   GUI_DrawBitmap(&tiny0,238,5);//
   Show_LowRange_Num();
   Display_Fish_Image();//
  
   Show_Related_Inform();//显示相关信息

   GUI_MULTIBUF_End();

  break;


default:
  WM_DefaultProc(pMsg);
  break;
}
}

WM_HWIN CreateWindowMOV(void) {
WM_HWIN hWin,hStatusWin;
hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
hTimer6 = WM_CreateTimer(hWin, ID_TIMER_TIME6, 125, 0);//开其定时器用于刷新图片
return hWin;
}

void MainTask(void){
  GUI_Init();
  WM_SetCreateFlags(WM_CF_MEMDEV);//use memory devices on all windows
   
  WM_MULTIBUF_Enable(1);
  WM_EnableMemdev(WM_HBKWIN);

    CreateWindowMOV();
  GUI_Primary_MEUN();
  GUI_Scondary_MEUN();//二级菜单
    while(1){
   GUI_Delay(25);
  }
}

下面是效果图,红色框内的图片偶尔会闪烁
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-12-5 20:30:21 | 显示全部楼层
两个问题
1、下面这两个函数,二选一即可,推荐使用三缓冲。
WM_SetCreateFlags(WM_CF_MEMDEV);//use memory devices on all windows
WM_MULTIBUF_Enable(1);

2、对话框WM_TIMER消息里面的GUI_DrawBitmapMag几个函数使用存储设备实现,提前绘制到存储设备里面,以后直接调用存储设备的WriteAt函数即可。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-12-6 11:08:20 | 显示全部楼层
eric2013 发表于 2019-12-5 20:30
两个问题
1、下面这两个函数,二选一即可,推荐使用三缓冲。
WM_SetCreateFlags(WM_CF_MEMDEV);//use mem ...

大佬您好,按照问题2,将wm_timer中使用了存储设备,发现图片不闪烁了,但是更新速度变慢了,不是定时器的频率,这是什么情况?
case WM_TIMER://?????,??????
  WM_RestartTimer(hTimer6, 125);
  GUI_MULTIBUF_Begin();

   Load_Sonar_picture();//??????
   Load_Sonar_Strength();//
   Update_Fish_Image();//

  WM_SelectWindow(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0));
GUI_MEMDEV_Select(hMemdesktop);               
  GUI_DrawBitmapMag(&SonarImage, 0, 0,1,2);//??????
  GUI_DrawBitmapMag(&Signal, 248, 0,1,2);//

   GUI_DrawBitmap(&bmruler, 237, 0);//
   GUI_DrawBitmap(&tiny0,238,5);//
   Show_LowRange_Num();
   Display_Fish_Image();//
  
   Show_Related_Inform();//??????

   GUI_MULTIBUF_End();

  break;
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-12-6 11:11:59 | 显示全部楼层
eric2013 发表于 2019-12-5 20:30
两个问题
1、下面这两个函数,二选一即可,推荐使用三缓冲。
WM_SetCreateFlags(WM_CF_MEMDEV);//use mem ...

大佬您好,按照您说的问题2,wm_timer加入了存储设备,发现图片时不闪烁了,但是更新频率变慢了,不是定时器的频率,这是什么情况?您给看看是不是这么操作?
static void _cbDialog(WM_MESSAGE * pMsg) {
        WM_HWIN hItem;
        static unsigned char count_open= 0;

        switch (pMsg->MsgId) {
        case WM_INIT_DIALOG://?????,????/?????,????????????????
                hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);
       
                break;
        case WM_CREATE:
//                        hTimer6 = WM_CreateTimer(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0), ID_TIMER_TIME6, 125, 0);
        sysprintf("wm create\r\n");
                break;

        case WM_TIMER://?????,??????
                WM_RestartTimer(hTimer6, 125);
sysprintf("WM_TIMER\r\n");
        GUI_MULTIBUF_Begin();


                        Load_Sonar_picture();//¼ÓÔØÉùÄÉͼÏñ
                        Load_Sonar_Strength();//¼ÓÔØÉùÄÉÇ¿¶È
                        Update_Fish_Image();//¸üÐÂÓãµÄͼ±ê
               
               
                WM_SelectWindow(WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0));
                GUI_MEMDEV_Select(hMemdesktop);                               
                GUI_DrawBitmapMag(&SonarImage, 0, 0,1,2);//»æÖÆÉùÄÉÐźÅ
                GUI_DrawBitmapMag(&Signal, 248, 0,1,2);//»æÖÆÉùÄÉÐźÅÇ¿¶È

                /*----------------------------  ½«Éî¶È·¶Î§µÄÊýÖµÏÔʾµ½¿Ì¶È³ßÉÏ  -----------------*/
                        GUI_DrawBitmap(&bmruler, 237, 0);//»æÖÆÉùÄÉÉî¶ÈµÄ¿Ì¶È³ß£»ÏñËØ 11*480
                        GUI_DrawBitmap(&tiny0,238,5);//¿Ì¶È³ß×îСֵ£¬¹Ì¶¨Îª0
                        Show_LowRange_Num();

                        Display_Fish_Image();//½«Óãͼ±íÏÔʾ
               
                        Show_Related_Inform();//½«ÉùÄɵÄÏà¹ØÐÅÏ¢ÏÔʾµ½ÆÁÄ»×óÉϽǠ      

                       
                        GUI_MEMDEV_Select(0);
                        GUI_MEMDEV_WriteAt(hMemdesktop,0,0);
       

        GUI_MULTIBUF_End();

                break;
       
       
        default:
                WM_DefaultProc(pMsg);
                break;
        }
}



WM_HWIN CreateWindowMOV(void);
WM_HWIN CreateWindowMOV(void) {
        WM_HWIN hWin,hStatusWin;

        hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
        hTimer6 = WM_CreateTimer(hWin, ID_TIMER_TIME6, 125, 0);
        hMemdesktop = GUI_MEMDEV_Create(0, 0, 272, 480);
        return hWin;
}



void MainTask(void){
                GUI_Init();
                WM_SetCreateFlags(WM_CF_MEMDEV);//use memory devices on all windows
   
                WM_MULTIBUF_Enable(1);
                WM_EnableMemdev(WM_HBKWIN);

       
    CreateWindowMOV();
                GUI_Primary_MEUN();
                GUI_Scondary_MEUN();//¶þ¼¶²Ëµ¥
    while(1){
                        GUI_Delay(25);
                }       
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-12-7 10:39:16 | 显示全部楼层
尘世那么美 发表于 2019-12-6 11:11
大佬您好,按照您说的问题2,wm_timer加入了存储设备,发现图片时不闪烁了,但是更新频率变慢了,不是定 ...

把wm_timer消息里面multibuf的begin和end函数删了,在这里多余了
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-11-3 15:38:57 | 显示全部楼层
eric2013 发表于 2019-12-5 20:30
两个问题
1、下面这两个函数,二选一即可,推荐使用三缓冲。
WM_SetCreateFlags(WM_CF_MEMDEV);//use mem ...

牛啊牛啊,真的解决了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 03:12 , Processed in 0.172203 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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