硬汉嵌入式论坛

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

[emWin] 有關 使用WM_HideWindow會卡卡的

[复制链接]

1

主题

0

回帖

5

积分

新手上路

积分
5
发表于 2018-9-10 19:56:23 | 显示全部楼层 |阅读模式
試著按照教程寫了一個很簡單的頁面切換程序

利用WM_HideWindow跟WM_ShowWindow
進行五個頁面的切換
再用大大隱藏按鈕的教學
使用
    GUI_SetAlpha(0xFF);
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
    WM_SetHasTrans(hItem);
    GUI_SetAlpha(0);
    WM_SetCallback(hItem, _cbButton);


配上回調函式進行切換
static void _cbButton(WM_MESSAGE * pMsg) //--------------(3)

{
     WM_HWIN  hWin;
     hWin  = pMsg->hWin;
     switch(pMsg->MsgId)
     {
                        case WM_PAINT:
                                if (BUTTON_IsPressed(hWin))  
                                {
                                WM_HideWindow(hPage[0]);
                               WM_ShowWindow(hPage[1]);
                                }  
                                else  
                                {
                                }
                                break;
      default:
      BUTTON_Callback(pMsg);

     }
}



但是這樣子使用在800x480的螢幕上,可以明顯感覺出卡,是哪裡用錯了嗎?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115770
QQ
发表于 2018-9-11 03:01:22 | 显示全部楼层
楼主方便的话,贴一个稍完整的程序,我帮你修改下。
仅需emWin部分即可。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2018-9-11 09:05:44 | 显示全部楼层
感謝大神支援
代碼如下,附件是所有的頁面,再麻煩大神幫我看一下。

  1. /*********************************************************************
  2. *
  3. *       _aDialogCreate
  4. */
  5. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  6.   { WINDOW_CreateIndirect, "WindowHome", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 0 },
  7.   { IMAGE_CreateIndirect, "ImageHome", ID_IMAGE_0, 0, 0, 480, 272, 0, 0, 0 },
  8.   { BUTTON_CreateIndirect, "Setting", ID_BUTTON_0, 0, 36, 64, 55, 0, 0x0, 0 },
  9.   { BUTTON_CreateIndirect, "Status", ID_BUTTON_1, 0, 90, 64, 55, 0, 0x0, 0 },
  10.   { BUTTON_CreateIndirect, "Log", ID_BUTTON_2, 0, 145, 64, 55, 0, 0x0, 0 },
  11.   { BUTTON_CreateIndirect, "Info", ID_BUTTON_3, 0, 200, 64, 55, 0, 0x0, 0 },
  12.   { BUTTON_CreateIndirect, "Home", ID_BUTTON_4, 396, 12, 50, 20, 0, 0x0, 0 },
  13.   // USER START (Optionally insert additional widgets)
  14.   // USER END
  15. };

  16. /*********************************************************************
  17. *
  18. *       Static code
  19. *
  20. **********************************************************************
  21. */


  22. static void _cbButton(WM_MESSAGE * pMsg) //--------------(3)

  23. {
  24.      WM_HWIN  hWin;
  25.      hWin  = pMsg->hWin;
  26.      switch(pMsg->MsgId)
  27.      {
  28.                         case WM_PAINT:
  29.                                 if (BUTTON_IsPressed(hWin))  
  30.                                 {
  31.                                 WM_HideWindow(hPage[0]);
  32.         WM_ShowWindow(hPage[1]);
  33.                                 }  
  34.                                 else  
  35.                                 {
  36.                                         //GUI_SetAlpha(0xFF);
  37.                                 }
  38.                                 break;

  39.       default:
  40.       BUTTON_Callback(pMsg);

  41.      }

  42. }
  43. static void _cbButton1(WM_MESSAGE * pMsg) //--------------(3)

  44. {
  45.      WM_HWIN  hWin;
  46.      hWin  = pMsg->hWin;
  47.      switch(pMsg->MsgId)
  48.      {
  49.                         case WM_PAINT:
  50.                                 if (BUTTON_IsPressed(hWin))  
  51.                                 {
  52.                                 WM_HideWindow(hPage[0]);
  53.         WM_ShowWindow(hPage[2]);
  54.                                 }  
  55.                                 else  
  56.                                 {
  57.                                         //GUI_SetAlpha(0xFF);
  58.                                 }
  59.                                 break;

  60.       default:
  61.       BUTTON_Callback(pMsg);

  62.      }

  63. }
  64. static void _cbButton2(WM_MESSAGE * pMsg) //--------------(3)

  65. {
  66.      WM_HWIN  hWin;
  67.      hWin  = pMsg->hWin;
  68.      switch(pMsg->MsgId)
  69.      {
  70.                         case WM_PAINT:
  71.                                 if (BUTTON_IsPressed(hWin))  
  72.                                 {
  73.         WM_HideWindow(hPage[0]);
  74.         WM_ShowWindow(hPage[3]);
  75.                                 }  
  76.                                 else  
  77.                                 {
  78.                                         //GUI_SetAlpha(0xFF);
  79.                                 }
  80.                                 break;

  81.       default:
  82.       BUTTON_Callback(pMsg);

  83.      }

  84. }
  85. static void _cbButton3(WM_MESSAGE * pMsg) //--------------(3)

  86. {
  87.      WM_HWIN  hWin;
  88.      hWin  = pMsg->hWin;
  89.      switch(pMsg->MsgId)
  90.      {
  91.                         case WM_PAINT:
  92.                                 if (BUTTON_IsPressed(hWin))  
  93.                                 {
  94.         WM_HideWindow(hPage[0]);
  95.         WM_ShowWindow(hPage[4]);
  96.                                 }  
  97.                                 else  
  98.                                 {
  99.                                         //GUI_SetAlpha(0xFF);
  100.                                 }
  101.                                 break;

  102.       default:
  103.       BUTTON_Callback(pMsg);

  104.      }

  105. }
  106. static void _cbButton4(WM_MESSAGE * pMsg) //--------------(3)

  107. {
  108.      WM_HWIN  hWin;
  109.      hWin  = pMsg->hWin;
  110.      switch(pMsg->MsgId)
  111.      {
  112.                         case WM_PAINT:
  113.                                 if (BUTTON_IsPressed(hWin))  
  114.                                 {
  115.                                         //GUI_SetAlpha(0xFF);
  116.                                 }  
  117.                                 else  
  118.                                 {
  119.                                         //GUI_SetAlpha(0xFF);
  120.                                 }
  121.                                 break;

  122.       default:
  123.       BUTTON_Callback(pMsg);

  124.      }

  125. }






  126. /*********************************************************************
  127. *
  128. *       _GetImageById
  129. */
  130. static const void * _GetImageById(U32 Id, U32 * pSize) {
  131.   switch (Id) {
  132.   case ID_IMAGE_0_IMAGE_0:
  133.     *pSize = sizeof(_acImage_0);
  134.     return (const void *)_acImage_0;
  135.   }
  136.   return NULL;
  137. }

  138. // USER START (Optionally insert additional static code)
  139. // USER END

  140. /*********************************************************************
  141. *
  142. *       _cbDialog
  143. */
  144. static void _cbDialog(WM_MESSAGE * pMsg) {
  145.   const void * pData;
  146.   WM_HWIN      hItem;
  147.   U32          FileSize;
  148.   int          NCode;
  149.   int          Id;
  150.   // USER START (Optionally insert additional variables)
  151.   // USER END

  152.   switch (pMsg->MsgId) {
  153.   case WM_INIT_DIALOG:
  154.     //
  155.     // Initialization of 'ImageHome'
  156.     //
  157.     hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);
  158.     pData = _GetImageById(ID_IMAGE_0_IMAGE_0, &FileSize);
  159.     IMAGE_SetBMP(hItem, pData, FileSize);
  160.     // USER START (Optionally insert additional code for further widget initialization)
  161.     // USER END

  162.                
  163.   
  164.                 GUI_SetAlpha(0xFF);
  165.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
  166.     WM_SetHasTrans(hItem);
  167.                 GUI_SetAlpha(0);
  168.                 WM_SetCallback(hItem, _cbButton);
  169.                
  170.                 GUI_SetAlpha(0xFF);
  171.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
  172.     WM_SetHasTrans(hItem);
  173.                 GUI_SetAlpha(0);
  174.                 WM_SetCallback(hItem, _cbButton1);


  175.                 GUI_SetAlpha(0xFF);
  176.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
  177.     WM_SetHasTrans(hItem);
  178.                 GUI_SetAlpha(0);
  179.                 WM_SetCallback(hItem, _cbButton2);

  180.                 GUI_SetAlpha(0xFF);
  181.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3);
  182.     WM_SetHasTrans(hItem);
  183.                 GUI_SetAlpha(0);
  184.                 WM_SetCallback(hItem, _cbButton3);

  185.                 GUI_SetAlpha(0xFF);
  186.     hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_4);
  187.     WM_SetHasTrans(hItem);
  188.                 GUI_SetAlpha(0);
  189.                 WM_SetCallback(hItem, _cbButton4);






  190.     break;
  191.   case WM_NOTIFY_PARENT:
  192.     Id    = WM_GetId(pMsg->hWinSrc);
  193.     NCode = pMsg->Data.v;
  194.     switch(Id) {
  195.     case ID_BUTTON_0: // Notifications sent by 'Setting'
  196.       switch(NCode) {
  197.       case WM_NOTIFICATION_CLICKED:
  198.         // USER START (Optionally insert code for reacting on notification message)
  199.         // USER END
  200.         break;
  201.       case WM_NOTIFICATION_RELEASED:
  202.         // USER START (Optionally insert code for reacting on notification message)
  203.         // USER END
  204.         break;
  205.       // USER START (Optionally insert additional code for further notification handling)
  206.       // USER END
  207.       }
  208.       break;
  209.     case ID_BUTTON_1: // Notifications sent by 'Status'
  210.       switch(NCode) {
  211.       case WM_NOTIFICATION_CLICKED:
  212.         // USER START (Optionally insert code for reacting on notification message)
  213.         // USER END
  214.         break;
  215.       case WM_NOTIFICATION_RELEASED:
  216.         // USER START (Optionally insert code for reacting on notification message)
  217.         // USER END
  218.         break;
  219.       // USER START (Optionally insert additional code for further notification handling)
  220.       // USER END
  221.       }
  222.       break;
  223.     case ID_BUTTON_2: // Notifications sent by 'Log'
  224.       switch(NCode) {
  225.       case WM_NOTIFICATION_CLICKED:
  226.         // USER START (Optionally insert code for reacting on notification message)
  227.         // USER END
  228.         break;
  229.       case WM_NOTIFICATION_RELEASED:
  230.         // USER START (Optionally insert code for reacting on notification message)
  231.         // USER END
  232.         break;
  233.       // USER START (Optionally insert additional code for further notification handling)
  234.       // USER END
  235.       }
  236.       break;
  237.     case ID_BUTTON_3: // Notifications sent by 'Info'
  238.       switch(NCode) {
  239.       case WM_NOTIFICATION_CLICKED:
  240.         // USER START (Optionally insert code for reacting on notification message)
  241.         // USER END
  242.         break;
  243.       case WM_NOTIFICATION_RELEASED:
  244.         // USER START (Optionally insert code for reacting on notification message)
  245.         // USER END
  246.         break;
  247.       // USER START (Optionally insert additional code for further notification handling)
  248.       // USER END
  249.       }
  250.       break;
  251.     case ID_BUTTON_4: // Notifications sent by 'Home'
  252.       switch(NCode) {
  253.       case WM_NOTIFICATION_CLICKED:
  254.         // USER START (Optionally insert code for reacting on notification message)
  255.         // USER END
  256.         break;
  257.       case WM_NOTIFICATION_RELEASED:
  258.         // USER START (Optionally insert code for reacting on notification message)
  259.         // USER END
  260.         break;
  261.       // USER START (Optionally insert additional code for further notification handling)
  262.       // USER END
  263.       }
  264.       break;
  265.     // USER START (Optionally insert additional code for further Ids)
  266.     // USER END
  267.     }
  268.     break;
  269.   // USER START (Optionally insert additional message handling)
  270.   // USER END
  271.   default:
  272.     WM_DefaultProc(pMsg);
  273.     break;
  274.   }
  275. }

  276. /*********************************************************************
  277. *
  278. *       Public code
  279. *
  280. **********************************************************************
  281. */
  282. /*********************************************************************
  283. *
  284. *       CreateWindowHome
  285. */
  286. WM_HWIN CreateWindowHome(void);
  287. WM_HWIN CreateWindowHome(void) {
  288.   WM_HWIN hWin;

  289.   hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  290.   return hWin;
  291. }

  292. // USER START (Optionally insert additional public code)
  293. // USER END

  294. /*************************** End of file ****************************/
复制代码


另再請教一下,emwin在運行時,程序會自行將圖片等較大的檔案般到SRAM中嗎?還是需要自行設定?

BK.zip

10.12 KB, 下载次数: 29

回复

使用道具 举报

12

主题

104

回帖

140

积分

初级会员

积分
140
发表于 2018-9-11 09:06:11 | 显示全部楼层
用了透明是这样的啦。。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2018-9-11 09:08:45 | 显示全部楼层
小銘_qN6g0 发表于 2018-9-11 09:05
感謝大神支援
代碼如下,附件是所有的頁面,再麻煩大神幫我看一下。

話說,我用同一個微信登入,怎麼變成不同帳號0.0..?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115770
QQ
发表于 2018-9-11 12:32:03 | 显示全部楼层
小銘_qN6g0 发表于 2018-9-11 09:05
感謝大神支援
代碼如下,附件是所有的頁面,再麻煩大神幫我看一下。

不会,这个需要用户自己去设置的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115770
QQ
发表于 2018-9-11 13:11:29 | 显示全部楼层
小銘_qN6g0 发表于 2018-9-11 09:05
感謝大神支援
代碼如下,附件是所有的頁面,再麻煩大神幫我看一下。

方便在模拟器上做个测试不,仅测1个c文件即可,能说明问题就行,刚刚测试你发的这个,我这里测试白屏
QQ截图20180911131158.png
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2018-9-11 13:14:11 | 显示全部楼层
eric2013 发表于 2018-9-11 12:32
不会,这个需要用户自己去设置的。

所以我這樣子的寫法,emwin的動作都是從flash讀出來,在顯示的對嗎?所以才能明顯感到lag?

關於頁面隱藏,有哪部分需要修的呢?

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115770
QQ
发表于 2018-9-11 14:25:59 | 显示全部楼层
小銘_qN6g0 发表于 2018-9-11 13:14
所以我這樣子的寫法,emwin的動作都是從flash讀出來,在顯示的對嗎?所以才能明顯感到lag?

關於頁面隱 ...

方便在模拟器上做个简单的测试不,你刚刚提供的,添加到模拟器是无法编译,我简单修改下,问题有点多。

方便的话,就可以给你测试优化下了。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2018-9-11 14:47:18 | 显示全部楼层
eric2013 发表于 2018-9-11 14:25
方便在模拟器上做个简单的测试不,你刚刚提供的,添加到模拟器是无法编译,我简单修改下,问题有点多。
...

模擬器我還不會使用....學習中...

我把一些相關的.c  .h給大大看一下

再麻煩大大了!!

Src.zip

309.73 KB, 阅读权限: 255, 下载次数: 30

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115770
QQ
发表于 2018-9-12 02:06:01 | 显示全部楼层
小銘_qN6g0 发表于 2018-9-11 14:47
模擬器我還不會使用....學習中...

我把一些相關的.c  .h給大大看一下

好的,白天了就给你看下,现在有点晚了。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2018-9-12 14:20:03 | 显示全部楼层
大大辛苦了!! 這麼晚還再拼...

我有做一個測試,把我的Callback拿掉

用按鈕預設的case去跑
WM_HideWindow(hPage[0]);
WM_ShowWindow(hPage[1]);

發現比較不會卡,會是我Callback寫得不好嗎?
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2018-9-12 17:32:37 | 显示全部楼层
在小小問一個問題,
若更改方法,用背景jpg圖把按鈕蓋住
這樣有機會實現嗎?

因為我的jpg圖,不管如何設定都在最底層,按鈕都在最上層....
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115770
QQ
发表于 2018-9-12 18:43:23 | 显示全部楼层
小銘_qN6g0 发表于 2018-9-12 14:20
大大辛苦了!! 這麼晚還再拼...

我有做一個測試,把我的Callback拿掉

是的,基本确定是你的回调函数做的不太好。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115770
QQ
发表于 2018-9-12 18:44:37 | 显示全部楼层
小銘_qN6g0 发表于 2018-9-12 17:32
在小小問一個問題,
若更改方法,用背景jpg圖把按鈕蓋住
這樣有機會實現嗎?

看了你的代码,不太好整理出来,你现在按钮回调要实现什么功能。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2018-9-12 19:20:46 | 显示全部楼层
回調函數要實現的就只有切換頁面

其他的什麼都不用做,

會使用自定義回調函數的目的為隱藏按鈕,使按鈕變成透明。

還是有其他方法可以使按鈕變透明?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115770
QQ
发表于 2018-9-13 03:45:01 | 显示全部楼层
小銘_qN6g0 发表于 2018-9-12 19:20
回調函數要實現的就只有切換頁面

其他的什麼都不用做,

你直接发个按下和松开的两种效果图,我就明白了。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2018-9-13 17:12:06 | 显示全部楼层
eric2013 发表于 2018-9-13 03:45
你直接发个按下和松开的两种效果图,我就明白了。

按下跟鬆開都不要有效果,純粹的透明,這樣會方便做嗎?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115770
QQ
发表于 2018-9-14 01:36:23 | 显示全部楼层
小銘_qN6g0 发表于 2018-9-13 17:12
按下跟鬆開都不要有效果,純粹的透明,這樣會方便做嗎?

类似我播放器底部的图标效果吗
12_58_890e07c55d45c38.png
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2018-9-14 13:23:13 | 显示全部楼层
對,類似,我的底圖就已經畫上按鈕了,所以想說如果把按鈕變成整個透明的
那底圖的按鈕圖片就會跑出來。
再請大大支援一下!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115770
QQ
发表于 2018-9-15 02:08:56 | 显示全部楼层
小銘_qN6g0 发表于 2018-9-14 13:23
對,類似,我的底圖就已經畫上按鈕了,所以想說如果把按鈕變成整個透明的
那底圖的按鈕圖片就會跑出來。
...

也是这个界面,按下按钮的时候会有透明效果。

实现方法比较简单,绘制图片前后调用下Alpha函数即可,详情看此贴的音乐播放器部分实现即可
用的按钮自定义回调函数
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 08:55 , Processed in 0.555300 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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