硬汉嵌入式论坛

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

[emWin] 帮忙看看 为什么不能安静的切换界面

[复制链接]

5

主题

24

回帖

39

积分

新手上路

积分
39
发表于 2016-11-3 09:47:43 | 显示全部楼层 |阅读模式
会是什么原因引起来的呢?
如何做到界面安静的从一页切换到另一页, 就先不上代码了,比较乱, 大家可能一看现象就知道原因了

第二个界面

第二个界面

第一个界面

第一个界面

切换过渡

切换过渡
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-3 09:48:28 | 显示全部楼层
不好意思,图片发的太大了
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-3 09:59:38 | 显示全部楼层

界面上的控件是一个一个的显示出来,不是一下子全部显示

代码中已经用了WM_CF_MEMDEV参数
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-3 10:44:56 | 显示全部楼层

在线等,帮忙顶一下!

找不到方向
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-3 12:00:15 | 显示全部楼层
最的一张是界面过渡时,设置断点拍下的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-11-3 12:07:49 | 显示全部楼层
你发的这些都是在新创建的窗口或者对话框上面做的吗,另外就是你切换的是如何切换的,看下关键代码。

另外你当前的是什么问题,是切换的速度有点慢吗,可以明显看到拉窗帘。
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-3 13:18:14 | 显示全部楼层
谢谢硬汉的回答,我现在问题是从一个界面切换到另一个界面时,另一个界面不是一下子显示出来, 会出现上面的最后一张图片一样,(当然是设置了断点),
变成界面切换不怪, 特别是当另一个界面有底图时(需要从flash加载),会出现界面上的控件都显示出来, 过1秒会才把底图刷新出来
主要代码
创建一个界面
static void _cbWin(WM_MESSAGE * pMsg)
{
    static int yPosToucan;
    static int yAdd;
    GUI_RECT   Rect = { 0, 0, 0, 0 };
    WM_HWIN    hItem;
    WM_HWIN    hDlg;
    WM_HWIN    hText;
    int        NCode;
    int        Id;
    int        Sel;
    int xSize, ySize;
    GUI_BITMAP Bitmap;
      GUI_LOGPALETTE Palette;
    yPosToucan = 20;
    yAdd = 1;
    hDlg = pMsg->hWin;
    switch (pMsg->MsgId)
    {
    case WM_NOTIFY_PARENT:

        break;
    case USER_KEY_ENTER:
        // WM_InvalidateWindow(hDlg);
        WM_HideWindow(MenuPar.hWinCur);
        GuiTime();
        break;
    case WM_KEY:
    {
        switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
                        {
                        case GUI_KEY_UP:     
                              printf("GUI_KEY_ENTER _cbDialog0 \\r\\n");   
                            break;
                        case GUI_KEY_DOWN:   
                            printf("GUI_KEY_ENTER _cbDialog0 \\r\\n");   
                            break;
                        case GUI_KEY_ENTER:                           
                            printf("GUI_KEY_ENTER _cbDialog0 \\r\\n");   
                           WM_InvalidateWindow(hDlg);
                            break;   
                        default:
                            break;
                    }  
        printf("WM_KEY _cbDialog0 \\r\\n");        
    }
    break;
    case  WM_CREATE:
   
        break;
    // GUI_MOVIE_Create(const void * pFileData,U32 FileSize,GUI_MOVIE_FUNC * pfNotify)
    case WM_PAINT:
        xSize = WM_GetWindowSizeX(hWin);
        ySize = WM_GetWindowSizeY(hWin);
        //
        // Draw background
        //
        #if  1
        ShowPngPos("127.dta",0,0);
        GUI_CreateBitmapFromStream(&Bitmap, &ampalette, PngFile._acBuffer2);   
           GUI_DrawBitmap(&Bitmap, 0, 0);
        GUI_ALLOC_Free(PngFile.hMem);
        #else
        GUI_SetColor(0x007a9730);
        GUI_FillRect(0, 0, xSize - 1, ySize - 3);
        #endif
        /*
        * Draw background and toucan
        */
        // GUI_DrawBitmap(&_bmHund, 0, 0);
        //GUI_DrawBitmap(&_bmToucan, 146, yPosToucan);
        //xSize = WM_GetWindowSizeX(pMsg->hWin);
        //ySize = WM_GetWindowSizeY(pMsg->hWin);

        //GUI_DrawGradientH(0, 0, xSize - 1, ySize - 1, 0xfffff56c, 0xffffffe8);
        //GUI_DrawGradientH(0, 0, 240, 280, 0xffff0d23, 0xfffff56c);
        //    GUI_SetColor(GUI_YELLOW);
        //U8    Alpha=20;
        ///GUI_SetAlpha(0x80);
        //GUI_DrawHLine(120, 0,232);

        break;
    }
}

    WM_HWIN MainAA_Task(void);
WM_HWIN MainAA_Task(void)
{
    unsigned char i, data=1;
    WM_HMEM   imageHand;
    WM_SetCreateFlags(WM_CF_MEMDEV);
    GUI_Init();
    if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY)
    {
        GUI_ErrorOut("Not enough memory available.");
        return 0;
    }
    ShowPngPos("setting.dta",0,0);
    WM_EnableMemdev(WM_HBKWIN);
    WM_SetCallback(WM_HBKWIN, 0);
    CreatStatusWin();
    MenuPar.hWinMain= WM_CreateWindowAsChild(
                            0,                //????λ?á???С
                            30,
                            480,
                            272-30,
                            WM_HBKWIN, WM_CF_SHOW|WM_CF_MEMDEV,
                            _cbWin,
                            0);
    WM_EnableMemdev(MenuPar.hWinMain);
    MenuPar.hWinCur=MenuPar.hWinMain;   
    imageHand=IMAGE_CreateUser(480-55,242-55,48,48, MenuPar.hWinMain, WM_CF_SHOW|WM_CF_MEMDEV, 0, GUI_ID_IMAGE0,1);   
    MenuPar.hWinTime=imageHand;
    IMAGE_SetUserData(imageHand,&data,1);   
    WM_SetCallback(imageHand, _cbImage);   
        CreatHtuWin();
        CreatVocWin();
        CreateCh2oWin();
        CreatePm25Win();
        CreateAqiWin();
    return hWin;
}


创建另一个界面

#include <stddef.h>
#include <string.h>
#include "WM.h"
#include "gui_common.h"

void   createTimeAdj(void);
void   createTimeSave(void);
void   createTimeFunItem(void);


static void _cbTimeSetWin(WM_MESSAGE * pMsg)
{
    static int yPosToucan;
    static int yAdd;
    GUI_RECT   Rect = { 0, 0, 0, 0 };
    WM_HWIN    hItem;
    WM_HWIN    hDlg;
    WM_HWIN    hText;
    int        NCode;
    int        Id;
    int        Sel;
    int xSize, ySize;
    yPosToucan = 20;
    yAdd = 1;
    hDlg = pMsg->hWin;
    switch (pMsg->MsgId)
    {
    case WM_NOTIFY_PARENT:

        break;
    case USER_KEY_ENTER:
        WM_DeleteWindow(MenuPar.hWinTimeSet);
        MenuPar.hWinCur=MenuPar.hWinMain;        
        WM_ShowWindow(MenuPar.hWinCur);        
        break;   
    case USER_KEY_DOWN:   
        break;
    case USER_KEY_UP:
        
        break;
    case WM_KEY:
    {
        
    }
    break;   
    case WM_CREATE:
         
        break;
    case WM_PAINT:
        xSize = WM_GetWindowSizeX(pMsg->hWin);
        ySize = WM_GetWindowSizeY(pMsg->hWin);   
        GUI_SetColor(0x00755530);
        GUI_FillRect(0, 0, xSize , ySize );        
         
        break;
    }
}


static void _cbTimeAdjWin(WM_MESSAGE * pMsg)
{
    static int yPosToucan;
    static int yAdd;
    GUI_RECT   Rect = { 0, 0, 0, 0 };
    WM_HWIN    hItem;
    WM_HWIN    hDlg;
    WM_HWIN    hText;
    int        NCode;
    int        Id;
    int        Sel;
    int xSize, ySize;
    yPosToucan = 20;
    yAdd = 1;
    hDlg = pMsg->hWin;
    switch (pMsg->MsgId)
    {
    case WM_NOTIFY_PARENT:

        break;
    case USER_KEY_ENTER:   
        break;   
    case USER_KEY_DOWN:        
        break;
    case USER_KEY_UP:
        
        break;
    case WM_KEY:
    {
        
    }
    break;   
    case WM_PAINT:
        xSize = WM_GetWindowSizeX(pMsg->hWin);
        ySize = WM_GetWindowSizeY(pMsg->hWin);   
        GUI_SetColor(0x00757730);
        GUI_FillRect(0, 0, xSize , ySize );        
        break;
    }
}


static void _cbTimeSaveWin(WM_MESSAGE * pMsg)
{
    static int yPosToucan;
    static int yAdd;
    GUI_RECT   Rect = { 0, 0, 0, 0 };
    WM_HWIN    hItem;
    WM_HWIN    hDlg;
    WM_HWIN    hText;
    int        NCode;
    int        Id;
    int        Sel;
    int xSize, ySize;
    yPosToucan = 20;
    yAdd = 1;
    hDlg = pMsg->hWin;
    switch (pMsg->MsgId)
    {
    case WM_NOTIFY_PARENT:

        break;
    case USER_KEY_ENTER:   
        break;   
    case USER_KEY_DOWN:        
        break;
    case USER_KEY_UP:
        
        break;
    case WM_KEY:
    {
        
    }
    break;   
    case WM_PAINT:
        xSize = WM_GetWindowSizeX(pMsg->hWin);
        ySize = WM_GetWindowSizeY(pMsg->hWin);   
        GUI_SetColor(0x00757730);
        GUI_FillRect(0, 0, xSize , ySize );        
        break;
    }
}



static void _cbImage(WM_MESSAGE * pMsg) {
  GUI_RECT Rect;
  int      Index;
  int      TextAlign;
  GUI_BITMAP Bitmap;
  GUI_LOGPALETTE Palette;
  unsigned char data;
  switch (pMsg->MsgId) {
  case WM_PAINT:     
    ShowPngPos("clock.dta",0,0);   
    GUI_CreateBitmapFromStream(&Bitmap, &ampalette, PngFile._acBuffer2);   
    GUI_DrawBitmap(&Bitmap, 0, 0);
    GUI_ALLOC_Free(PngFile.hMem);
    break;
  default:
    IMAGE_Callback(pMsg);
    break;
  }
}

void   createTimeAdj(void)
{
  WM_CreateWindowAsChild(50,
                        10,
                        300,
                        150,
                        MenuPar.hWinTimeSet,
                        WM_CF_SHOW | WM_CF_MEMDEV,
                        _cbTimeAdjWin, 0);;
}

void   createTimeSave(void)
{
  WM_CreateWindowAsChild(50,
                        170,
                        300,
                        50,
                        MenuPar.hWinTimeSet,
                        WM_CF_SHOW | WM_CF_MEMDEV,
                        _cbTimeSaveWin, 0);;
}

void   createTimeFunItem(void)
{
  WM_CreateWindowAsChild(360,
                        40,
                        100,
                        130,
                        MenuPar.hWinTimeSet,
                        WM_CF_SHOW | WM_CF_MEMDEV,
                        _cbTimeSaveWin, 0);;
}


void    GuiTime(void)
{
  WM_HMEM   imageHand;
  GUI_MEMDEV_Handle hMem;
  unsigned  char data;   
  MenuPar.hWinTimeSet= WM_CreateWindowAsChild(0,
                                            30,
                                            480,
                                            272-30,
                                            WM_HBKWIN,
                                            WM_CF_SHOW| WM_CF_MEMDEV,
                                            _cbTimeSetWin, 0);
  WM_EnableMemdev(MenuPar.hWinTimeSet);
  createTimeAdj();
  createTimeSave();
  createTimeFunItem();
  imageHand=IMAGE_CreateUser(480-55,242-55,48,48, MenuPar.hWinTimeSet, WM_CF_SHOW|WM_CF_MEMDEV, 0, GUI_ID_IMAGE0,1);   
  MenuPar.hWinTime=imageHand;
  IMAGE_SetUserData(imageHand,&data,1);
  WM_SetCallback(imageHand, _cbImage);   
  MenuPar.hWinCur=MenuPar.hWinTimeSet;
  GUI_MEMDEV_CopyToLCD(hMem);
  GUI_MEMDEV_Select(0);

}
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-3 14:16:21 | 显示全部楼层

回 eric2013 的帖子

eric2013:你发的这些都是在新创建的窗口或者对话框上面做的吗,另外就是你切换的是如何切换的,看下关键代码。

另外你当前的是什么问题,是切换的速度有点慢吗,可以明显看到拉窗帘。

 (2016-11-03 12:07) 
我vs2013里面仿真在一个界面里创建多个WM_CreateWindowAsChild,然后设置断点,发现界面也是一个一个WM_CreateWindowAsChild显示出来, 但是全速运行时,基本看不清, 而移到我的开发板时,就有感觉的出来, 特别是有加载背景图片时, 更慢,整个界面加载完成差不多要1秒左右,而且是一个一个WM_CreateWindowAsChild的方框显示出来
现在我有两个问题:
1、有没有办法让我把当前页所有的内容都输出到存储器后,然后再一次性显示在LCD上,
2、为什么加载一页的资源会那么的慢,差不多2秒, 从flash读取数据, 我先测试MCU读取flash的时间
任何回复,将不胜感谢!
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-3 14:40:01 | 显示全部楼层

回 jd9945 的帖子

jd9945:我vs2013里面仿真在一个界面里创建多个WM_CreateWindowAsChild,然后设置断点,发现界面也是一个一个WM_CreateWindowAsChild显示出来, 但是全速运行时,基本看不清, 而移到我的开发板时,就有感觉的出来, 特别是有加载背景图片时, 更慢,整个界面加载完成差不多要1秒左右,而 .. (2016-11-03 14:16) 
读取480*272的一张图大小255K,读取时间为300ms
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-11-4 08:03:02 | 显示全部楼层

回 jd9945 的帖子

jd9945:读取480*272的一张图大小255K,读取时间为300ms (2016-11-03 14:40) 
如果是F429的话,性能会很强的,这里我写方法了。
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=20967
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-4 10:52:02 | 显示全部楼层

回 eric2013 的帖子

eric2013:如果是F429的话,性能会很强的,这里我写方法了。
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=20967 (2016-11-04 08:03) 
我用的就是STM32F429
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-4 10:58:49 | 显示全部楼层

回 eric2013 的帖子

eric2013:如果是F429的话,性能会很强的,这里我写方法了。
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=20967 (2016-11-04 08:03) 
我刚才看了你的例子, 是你贴一张图, 那我的一个界面不值一张底图, 还有其他控件, 那我应该如何实现呢? 才不会让界面上的控件变成先后出来
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2016-11-4 11:08:14 | 显示全部楼层
楼主,你的程序怎么看着怪怪的,关于界面切换的程序我觉得你可以参考一下硬汉的ATM的例子,用他的那种方法对创建窗口和切换很便利了。你先把加载图片的程序注释掉看看只刷控件会不会出现这种情况
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-4 11:32:19 | 显示全部楼层

回 古骨config 的帖子

古骨config:楼主,你的程序怎么看着怪怪的,关于界面切换的程序我觉得你可以参考一下硬汉的ATM的例子,用他的那种方法对创建窗口和切换很便利了。你先把加载图片的程序注释掉看看只刷控件会不会出现这种情况 (2016-11-04 11:08) 
试了, 只加载控件也是会有这种现象, 只是时间比较短,但是认真看就会发现界面切换时不干净
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-4 14:05:12 | 显示全部楼层
界面切换视频.zip (2.99 MB, 下载次数: 79)
硬汉
我已经用上了你说的方法
void   CreatMainBmpHem(void)
{
   GUI_BITMAP Bitmap;
   GUI_LOGPALETTE Palette;
   MemdevPar.mainBmphem=GUI_MEMDEV_CreateFixed(0, 30, 480, 242,
                        GUI_MEMDEV_HASTRANS,
                        GUI_MEMDEV_APILIST_32,
                        GUICC_M8888);
    GUI_MEMDEV_Select(MemdevPar.mainBmphem);
    GUI_CreateBitmapFromStream(&Bitmap, &ampalette, MainBkFile._acBuffer2);   
       GUI_DrawBitmap(&Bitmap, 0, 0);
    //GUI_PNG_Draw(MainBkFile._acBuffer2, MainBkFile.Size, 0, 30);   
    GUI_MEMDEV_Select(0);
}

主界面的回调函数
case WM_PAINT:            
        GUI_MEMDEV_Write(MemdevPar.mainBmphem);
        DriLedList.Command(&DriLedList,
                    1,
                    LED_DRI_ON,
                    10);
        break
第二个界面的回调函数
        case USER_KEY_ENTER:
        WM_DeleteWindow(MenuPar.hWinTimeSet);
        MenuPar.hWinCur=MenuPar.hWinMain;   
        DriLedList.Command(&DriLedList,
                    1,
                    LED_DRI_OFF,
                    10);
        WM_ShowWindow(MenuPar.hWinCur);               
        break;   
从第二个界面删除灯夹到第一个界面的回调函数灯亮用时120ms, 但从视频中给人的感觉远超过500ms, 是什么原因呢? 感觉是sdram中的数据没有及时送到TFT的样子
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-4 14:06:33 | 显示全部楼层
谢谢大家的一直关注!
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2016-11-7 09:25:31 | 显示全部楼层
顶一下,求刷新
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-18 00:26 , Processed in 0.052048 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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