求助帖,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);
}
}
下面是效果图,红色框内的图片偶尔会闪烁
两个问题
1、下面这两个函数,二选一即可,推荐使用三缓冲。
WM_SetCreateFlags(WM_CF_MEMDEV);//use memory devices on all windows
WM_MULTIBUF_Enable(1);
2、对话框WM_TIMER消息里面的GUI_DrawBitmapMag几个函数使用存储设备实现,提前绘制到存储设备里面,以后直接调用存储设备的WriteAt函数即可。 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;
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);
}
} 尘世那么美 发表于 2019-12-6 11:11
大佬您好,按照您说的问题2,wm_timer加入了存储设备,发现图片时不闪烁了,但是更新频率变慢了,不是定 ...
把wm_timer消息里面multibuf的begin和end函数删了,在这里多余了 eric2013 发表于 2019-12-5 20:30
两个问题
1、下面这两个函数,二选一即可,推荐使用三缓冲。
WM_SetCreateFlags(WM_CF_MEMDEV);//use mem ...
牛啊牛啊,真的解决了。
页:
[1]