尘世那么美 发表于 2019-12-5 19:20:02

求助帖,emwin显示图片闪烁

求助论坛大佬,现在使用的是新塘的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);
}
}

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

eric2013 发表于 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函数即可。

尘世那么美 发表于 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;

尘世那么美 发表于 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);
                }       
}

eric2013 发表于 2019-12-7 10:39:16

尘世那么美 发表于 2019-12-6 11:11
大佬您好,按照您说的问题2,wm_timer加入了存储设备,发现图片时不闪烁了,但是更新频率变慢了,不是定 ...

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

jiajiaaigaoqian 发表于 2023-11-3 15:38:57

eric2013 发表于 2019-12-5 20:30
两个问题
1、下面这两个函数,二选一即可,推荐使用三缓冲。
WM_SetCreateFlags(WM_CF_MEMDEV);//use mem ...

牛啊牛啊,真的解决了。
页: [1]
查看完整版本: 求助帖,emwin显示图片闪烁