硬汉嵌入式论坛

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

[emWin] 使用emwin显示实时显示摄像头,在回调函数定时器消息内绘制能正常显示,在重绘消息内没有显示

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2025-1-9 15:46:26 | 显示全部楼层 |阅读模式
各位大佬请教一下,我使用V7-576_emWin摄像头实验移植过来,当在WM_TIMER消息内刷摄像头能正常在屏幕上但是文本显示不了,当在WM_PAINT消息内进行绘画时屏幕无显示把申请到保存到sd卡内查看图像是正常的

使用定时器消息刷新

使用重绘消息刷新屏幕无显示保存的内存到电脑上查看有显示



回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-1-9 21:45:13 | 显示全部楼层
#define Debug  0    //1使用定时器刷新 0重绘刷新
static void _cbDialog(WM_MESSAGE * pMsg)
{
        static  WM_HTIMER hTimerCAMERA;
        WM_HWIN          hItem;
        char s[30];
        static int i=0;
        switch (pMsg->MsgId)
        {
       
                /* 接收到摄像头数据 */
                case MSG_CAMERA:
                        #if Debug
                        hTimerCAMERA = WM_CreateTimer(pMsg->hWin, ID_TimerCAMERA, 2, 0);       
                        #else
                        WM_InvalidateWindow(hWinCamera);
                        #endif
                        break;
               
                case WM_TIMER:
                #if Debug
                        /* 删除定时器 */
                        WM_DeleteTimer(hTimerCAMERA);                       
                        /* 选择操作窗口 */                       
                        WM_SelectWindow(hWinCamera);
                        //GUI_MEMDEV_Select(hMemCamera);
                        /* Cache Clean和无效化 */
                        SCB_CleanInvalidateDCache();
                        /* 绘制到多缓冲里面 */
                        GUI_MULTIBUF_Begin();                       
                        GUI_MEMDEV_WriteAt(hMemCamera, CAMERA_X, CAMERA_Y);       
                        GUI_MULTIBUF_End();       
                       
                        hItem = WM_GetDialogItem(pMsg->hWin, (GUI_ID_USER + 0xAD));
                        sprintf(s, "IR:aaaaaaaaaa%d", i);
                        TEXT_SetText(hItem, s);
            GUI_Exec();
            camera_flag = 2;
                        g_tCam.CaptureOk = 0;
                       
                        #endif
                        break;
                case WM_PAINT:        
                #if  !Debug
                        GUI_MEMDEV_Select(hMemCamera);
                        SCB_CleanInvalidateDCache();
                        /* 绘制到多缓冲里面 */
                        //GUI_DrawBitmap(&bmCamera, CAMERA_X, CAMERA_Y);
                         hItem = WM_GetDialogItem(pMsg->hWin, (GUI_ID_USER + 0xAD));
                        sprintf(s, "IR:bbbbbbbb %d", i);
                        TEXT_SetText(hItem, s);       
                        GUI_MULTIBUF_Begin();                       
                        GUI_MEMDEV_WriteAt(hMemCamera, CAMERA_X, CAMERA_Y);       
                        GUI_MULTIBUF_End();
                        camera_flag = 2;
                        g_tCam.CaptureOk = 0;       
                        #endif
                        break;
                case WM_INIT_DIALOG:
                        hItem = pMsg->hWin;
                        WINDOW_SetBkColor(hItem, GUI_MAKE_COLOR(0x00f3f3ef));       
                        hItem = WM_GetDialogItem(pMsg->hWin, (GUI_ID_USER + 0xAD));
                        TEXT_SetFont(hItem, &GUI_Fontdengxian26);
                        TEXT_SetTextColor(hItem, GUI_BLACK);
                        TEXT_SetText(hItem, "Humiduty:");       
                default:
                        WM_DefaultProc(pMsg);
                        break;
        }
}

定时器刷新屏幕显示

定时器刷新屏幕显示

重绘刷新内存保存读取出来

重绘刷新内存保存读取出来

重绘屏幕显示

重绘屏幕显示
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2025-1-10 08:16:51 | 显示全部楼层

回帖奖励 +10 个金币

就在WM_TIMER里面绘制就行,如果先注释掉摄像头相关代码,仅在这个里面添加文本TEXT,可以正常绘制吧
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-1-10 10:46:38 | 显示全部楼层
eric2013 发表于 2025-1-10 08:16
就在WM_TIMER里面绘制就行,如果先注释掉摄像头相关代码,仅在这个里面添加文本TEXT,可以正常绘制吧

是有显示的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2025-1-11 07:26:08 | 显示全部楼层
1、你的这个里面处理,WM_SelectWindow进去后,绘制完,没有重新WM_SelectWindow出来吗
2、还有就是GUI_Exec();不要在这里调用。

case WM_TIMER:
                #if Debug
                        /* 删除定时器 */
                        WM_DeleteTimer(hTimerCAMERA);                       
                        /* 选择操作窗口 */                       
                        WM_SelectWindow(hWinCamera);
                        //GUI_MEMDEV_Select(hMemCamera);
                        /* Cache Clean和无效化 */
                        SCB_CleanInvalidateDCache();
                        /* 绘制到多缓冲里面 */
                        GUI_MULTIBUF_Begin();                       
                        GUI_MEMDEV_WriteAt(hMemCamera, CAMERA_X, CAMERA_Y);      
                        GUI_MULTIBUF_End();      
                       
                        hItem = WM_GetDialogItem(pMsg->hWin, (GUI_ID_USER + 0xAD));
                        sprintf(s, "IR:aaaaaaaaaa%d", i);
                        TEXT_SetText(hItem, s);
            GUI_Exec();
            camera_flag = 2;
                        g_tCam.CaptureOk = 0;
                       
                        #endif
                        break;
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-1-11 17:32:37 | 显示全部楼层
eric2013 发表于 2025-1-11 07:26
1、你的这个里面处理,WM_SelectWindow进去后,绘制完,没有重新WM_SelectWindow出来吗
2、还有就是GUI_Ex ...

感谢硬汉大佬指出问题,重新学习内存设备章节发现有细节没有注意到 修改代码后把文本写到内存后达到了效果case WM_TIMER:
                #if Debug
                  WM_DeleteTimer(hTimerCAMERA);   
                         
        /* 选择操作窗口 */                       
        WM_SelectWindow(hWinCamera);  
        /* Cache Clean和无效化 */
        SCB_CleanInvalidateDCache();
        GUI_MULTIBUF_Begin();  
        GUI_MEMDEV_Select(hMemCamera);
        hItem = WM_GetDialogItem(pMsg->hWin, (GUI_ID_USER + 0xAD));
        sprintf(s, "IR:aaaaaaaaaa%d", i);
        TEXT_SetText(hItem, s);
        GUI_DispStringAt(s, 10, 150); // 绘制文本到内存设备
        GUI_MEMDEV_Select(0);
      
        /* 绘制到多缓冲里面 */
                           
        GUI_MEMDEV_WriteAt(hMemCamera, CAMERA_X, CAMERA_Y);         
        GUI_MULTIBUF_End();   
   
                g_tCam.CaptureOk = 0;       
                        #endif
                        break;

回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-1-11 17:34:33 | 显示全部楼层
eric2013 发表于 2025-1-11 07:26
1、你的这个里面处理,WM_SelectWindow进去后,绘制完,没有重新WM_SelectWindow出来吗
2、还有就是GUI_Ex ...

修改后内存保存显示

内存显示

内存显示
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2025-1-12 07:33:41 | 显示全部楼层
1号小菜鸡 发表于 2025-1-11 17:32
感谢硬汉大佬指出问题,重新学习内存设备章节发现有细节没有注意到 修改代码后把文本写到内存后达到了效 ...

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 23:34 , Processed in 0.579034 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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