硬汉嵌入式论坛

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

[emWin] 切换窗口卡顿问题

[复制链接]

3

主题

9

回帖

18

积分

新手上路

积分
18
发表于 2019-11-22 17:23:11 | 显示全部楼层 |阅读模式
我做了一套UI系统,有八九个窗口需要切换。如果用显示/隐藏的方法很可能会内存不够,但是用delete / create方法又特别卡,背景差不多是从上到下慢慢地刷出来的。请问有什么好办法可以解决?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-11-22 18:18:45 | 显示全部楼层
emWin的动态内存够大的话,使用存储设备即可,可以大大加快速度。
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2019-11-26 17:42:37 | 显示全部楼层
eric2013 发表于 2019-11-22 18:18
emWin的动态内存够大的话,使用存储设备即可,可以大大加快速度。

我理解的是:
GUI_MEMDEV_Handle hMem0;
hMem0 = GUI_MEMDEV_CreateEx(0, 0, 480, 272, GUI_MEMDEV_HASTRANS);
GUI_MEMDEV_Select(hMem0);
GUI_DrawBitmap(pBmp[1], 0, 0);
创建内存设备,以及将图片存入内存这部分写在WM_INIT_DIALOG里。

GUI_SetBkColor(GUI_WHITE);
GUI_Clear();
GUI_MEMDEV_WriteAt(hMem0,0,0);
将内存中的图片输出到LCD屏这部分写在WM_PAINT里。
但是显示的结果窗口背景仍然没有图,只有白色背景,请问是怎么回事。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-11-26 18:21:58 | 显示全部楼层
braycl 发表于 2019-11-26 17:42
我理解的是:
GUI_MEMDEV_Handle hMem0;
hMem0 = GUI_MEMDEV_CreateEx(0, 0, 480, 272, GUI_MEMDEV_HA ...

你的GUIConf.C文件里面当前开辟的动态内存是多大。
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2019-11-26 19:39:55 | 显示全部楼层
eric2013 发表于 2019-11-26 18:21
你的GUIConf.C文件里面当前开辟的动态内存是多大。

按照教程配置的:
#define EX_SRAM 1/*1 used extern sram, 0 used internal sram */
#if EX_SRAM
#define GUI_NUMBYTES (1024*1024*8)
#else
#define GUI_NUMBYTES (100*1024)
#endif
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-11-26 20:21:43 | 显示全部楼层
braycl 发表于 2019-11-26 19:39
按照教程配置的:
#define EX_SRAM 1/*1 used extern sram, 0 used internal sram */
#if EX_SRAM

这个也没问题,看来得看看你的工程才行了,估计你的程序设计有点问题。
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2019-11-27 10:14:23 | 显示全部楼层
eric2013 发表于 2019-11-26 20:21
这个也没问题,看来得看看你的工程才行了,估计你的程序设计有点问题。

这是我大概的程序(第一个窗口的创建部分),窗口1既没有背景,从别的窗口切换回来还会闪烁。
static void _cbDialog1(WM_MESSAGE * pMsg);
static void _cbDialog1(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem;
    int NCode;
    int Id;
    hItem = pMsg->hWin;
    GUI_MEMDEV_Handle hMem0;
    hMem0 = GUI_MEMDEV_CreateEx(0, 0, 480, 272, GUI_MEMDEV_HASTRANS);

    switch (pMsg->MsgId)
    {
        case WM_INIT_DIALOG:

          WM_SetCreateFlags(WM_CF_MEMDEV);
          GUI_MEMDEV_Select(hMem0);
          GUI_DrawBitmap(pBmp[1], 0, 0);
// 初始化按钮控件
        hItem=WM_GetDialogItem(pMsg->hWin,ID_BUTTON_2);
        WM_SetHasTrans(hItem);
        WM_SetCallback(hItem,_cbButton2);

        hItem=WM_GetDialogItem(pMsg->hWin,ID_BUTTON_3);
        WM_SetHasTrans(hItem);
        WM_SetCallback(hItem,_cbButton3);
//初始化文本控件
        hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
        //TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
        TEXT_SetTextColor(hItem, GUI_BLACK);
        TEXT_SetFont(hItem, &GUI_Fontsunny);
        GUI_UC_SetEncodeUTF8();
        TEXT_SetText(hItem, pStr0);
        break;

    case WM_NOTIFY_PARENT:
        Id = WM_GetId(pMsg->hWinSrc);
        NCode = pMsg->Data.v;
        switch(Id)
        {

            case ID_BUTTON_2:
                switch(NCode)
                {
                    case WM_NOTIFICATION_CLICKED:
                        break;
                    case WM_NOTIFICATION_RELEASED:                    
                        GUI_EndDialog(hItem, 0);
                        GUI_CreateDialogBox(_aDialogCreate3, GUI_COUNTOF(_aDialogCreate3), _cbDialog3, WM_HBKWIN, 0, 0);
                        break;
                }
            break;

            case ID_BUTTON_3:
                switch(NCode)
                {
                    case WM_NOTIFICATION_CLICKED:
                        break;
                    case WM_NOTIFICATION_RELEASED:
                        GUI_EndDialog(pMsg->hWin, 0);
                        GUI_CreateDialogBox(_aDialogCreate4, GUI_COUNTOF(_aDialogCreate4), _cbDialog4, WM_HBKWIN, 0, 0);
                        break;
                }
            break;
            }
        break;

        case WM_PAINT:
        GUI_SetBkColor(GUI_WHITE);
        GUI_Clear();
        GUI_MEMDEV_Select(0);
        GUI_MEMDEV_WriteAt(hMem0,0,0);
        GUI_MEMDEV_Delete(hMem0);

      hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
      BUTTON_SetBitmapEx(hItem,BUTTON_BI_UNPRESSED,sBmp[0],0,0);

      hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3);
      BUTTON_SetBitmapEx(hItem,BUTTON_BI_UNPRESSED,sBmp[1],0,0);
            break;
    default:
    WM_DefaultProc(pMsg);
    break;
    }

}
//创建窗口
WM_HWIN CreateWindow(void);
WM_HWIN CreateWindow(void) {
  WM_HWIN hWin;
  hWin = GUI_CreateDialogBox(_aDialogCreate1, GUI_COUNTOF(_aDialogCreate1), _cbDialog1, WM_HBKWIN, 0, 0);
  return hWin;
}
/*
*********************************************************************************************************
*  MainTask
*********************************************************************************************************
*/
void MainTask(void)
{
    GUI_Init();
    WM_SetCreateFlags(WM_CF_MEMDEV);
    WM_MOTION_Enable(1);
    CreateWindow();
    while(1)
    {
        GUI_Delay(10);
    }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-11-28 15:46:59 | 显示全部楼层
这部分操作有问题:

QQ截图20191128154513.jpg
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2019-11-28 16:38:48 | 显示全部楼层
又看了很多帖子,改成了这样,按理说应该可以了,但还是窗口背景还是白板,图片我也试验过,应该没问题
GUI_MEMDEV_Handle hMem0;
hMem0 = GUI_MEMDEV_CreateFixed(0, 0, 480, 272, GUI_MEMDEV_HASTRANS, GUI_MEMDEV_APILIST_32, GUI_COLOR_CONV_8888);

case WM_INIT_DIALOG:
          WM_SetCreateFlags(WM_CF_MEMDEV);
          GUI_MEMDEV_Select(hMem0);
          GUI_DrawBitmap(pBmp[1], 0, 0);
          GUI_MEMDEV_Select(0);

case WM_PAINT:
        GUI_MEMDEV_WriteAt(hMem0,0,0);
        GUI_MEMDEV_Delete(hMem0);

回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2019-11-28 16:57:59 | 显示全部楼层
eric2013 发表于 2019-11-28 15:46
这部分操作有问题:

参考您的另一个帖子http://www.armbbs.cn/forum.php?m ... E%B0%2B%CD%B8%C3%F7
我试了试在窗口中显示狗那张图,结果整个贴图区域全黑了(包括透明背景和实际图像)。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-11-29 09:32:07 | 显示全部楼层
braycl 发表于 2019-11-28 16:38
又看了很多帖子,改成了这样,按理说应该可以了,但还是窗口背景还是白板,图片我也试验过,应该没问题
GU ...

这个用法还是不对。
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2019-11-29 09:39:06 | 显示全部楼层
eric2013 发表于 2019-11-29 09:32
这个用法还是不对。

我贴错了,是这样写的,是模仿您的那个帖子试验的为什么会不对呢,我试了试狗的那张图,内存区域全黑了
case WM_INIT_DIALOG:
          WM_SetCreateFlags(WM_CF_MEMDEV);
          GUI_MEMDEV_Select(hMem0);
          GUI_SetBkColor(GUI_TRANSPARENT);
          GUI_Clear();
          GUI_DrawBitmap(pBmp[1], 0, 0);
          GUI_MEMDEV_Select(0);
case WM_PAINT:
        GUI_MEMDEV_WriteAt(hMem0,0,0);
        GUI_MEMDEV_Delete(hMem0);
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-11-29 18:00:51 | 显示全部楼层
braycl 发表于 2019-11-29 09:39
我贴错了,是这样写的,是模仿您的那个帖子试验的为什么会不对呢,我试了试狗的那张图,内存区域全黑了
...

WM_PAINT里面不要做 GUI_MEMDEV_Delete(hMem0);操作

因为要进入好多次这个消息,你第1次就删除了,下次调用 GUI_MEMDEV_WriteAt(hMem0,0,0);直接就卡死了。
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2019-11-29 19:51:32 | 显示全部楼层
eric2013 发表于 2019-11-29 18:00
WM_PAINT里面不要做 GUI_MEMDEV_Delete(hMem0);操作

因为要进入好多次这个消息,你第1次就删除了,下 ...

不加delete语句背景还是白板
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-12-2 08:14:22 | 显示全部楼层
braycl 发表于 2019-11-29 19:51
不加delete语句背景还是白板

那你的程序的确有问题
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2019-12-2 14:26:03 | 显示全部楼层
eric2013 发表于 2019-12-2 08:14
那你的程序的确有问题

我把在内存设备中绘图的部分放到了全局变量的后面,就可以显示图片了。但是create这个窗口的时候屏幕闪烁得厉害,请问该怎么解决?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115785
QQ
发表于 2019-12-3 09:00:15 | 显示全部楼层
braycl 发表于 2019-12-2 14:26
我把在内存设备中绘图的部分放到了全局变量的后面,就可以显示图片了。但是create这个窗口的时候屏幕闪烁 ...

你当前工程存储设备的实现有点问题,参考我智能家居的例子试试

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 09:43 , Processed in 0.703676 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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