emWin及StemWin使用中關於菜單欄的應用與問題

来源:https://www.cnblogs.com/itdoy/archive/2018/06/05/9138835.html
-Advertisement-
Play Games

在我看來,emWin和StemWin就是基本相同的庫文件,關於這個庫文件的移植,網路上有很多教材,比如“ALIENTEK emWin開發手冊”,他們家提供了各種STM32系列的開發手冊,我這裡記錄的是關於使用“視窗對象(小工具)”中的“MENU(菜單)”這類小工具在應用過程中,遇到的問題進行記錄,並... ...


前言:在我看來,emWin和StemWin就是基本相同的庫文件,關於這個庫文件的移植,網路上有很多教材,比如“ALIENTEK emWin開發手冊”,他們家提供了各種STM32系列的開發手冊,我這裡記錄的是關於使用“視窗對象(小工具)”中的“MENU(菜單)”這類小工具在應用過程中,遇到的問題進行記錄,並且提出我的解決方案。

 

問題一:MENU(菜單)小工具如何使用?

答:1.包含MENU(菜單)小工具的庫文件;

#include "MENU.h"

 

  2.創建好FRAMEWIN(視窗)小工具後,定義MENU(菜單)小工具中每一項菜單的ID號(FRAMEWIN(視窗)小工具的創建請參照“ALIENTEK emWin開發手冊”);

#define ID_FRAMEWIN_0  (GUI_ID_USER + 0x00)//定義FRAMEWIN(視窗)小工具ID,菜單是創建在此基礎之上的,並且菜單的所有者是FRAMEWIN(視窗)小工具的框架視窗
#define ID_MENU  (GUI_ID_USER + 0x01)//定義菜單母板ID
#define ID_MENU_SERVER  (GUI_ID_USER + 0x02)//定義一級菜單ID
#define ID_MENU_SERVER_1  (GUI_ID_USER + 0x03)//定義二級菜單ID
#define ID_MENU_SERVER_2  (GUI_ID_USER + 0x04)//定義二級菜單ID
#define ID_MENU_SERVER_3  (GUI_ID_USER + 0x05)//定義二級菜單ID
#define ID_MENU_SERVER_4  (GUI_ID_USER + 0x06)//定義二級菜單ID
#define ID_MENU_SERVER_2_1  (GUI_ID_USER + 0x07)//定義三級菜單ID
#define ID_MENU_SERVER_2_2  (GUI_ID_USER + 0x08)//定義三級菜單ID
#define ID_MENU_SERVER_2_3  (GUI_ID_USER + 0x09)//定義三級菜單ID
#define ID_MENU_SUPPLY  (GUI_ID_USER + 0x0A)//定義一級菜單ID
#define ID_MENU_PROCESS  (GUI_ID_USER + 0x0B)//定義一級菜單ID

  3.定義MENU(菜單)小工具的“句柄”(註意:每一個菜單項,無論是幾級菜單項,都最好一一對應一個ID和“句柄”);

FRAMEWIN_Handle hFrame;//定義FRAMEWIN(視窗)小工具的“句柄”
MENU_Handle hMenu;//定義菜單母板的“句柄”
MENU_Handle hMenuServer;//定義一級菜單的“句柄”
MENU_Handle hMenuServer_1;//定義二級菜單的“句柄”
MENU_Handle hMenuServer_2;//定義二級菜單的“句柄”
MENU_Handle hMenuServer_3;//定義二級菜單的“句柄”
MENU_Handle hMenuServer_4;//定義二級菜單的“句柄”
MENU_Handle hMenuSupply;//定義一級菜單的“句柄”
MENU_Handle hMenuProcess;//定義一級菜單的“句柄”
MENU_Handle hMenuServer_2_1;//定義三級菜單的“句柄”
MENU_Handle hMenuServer_2_2;//定義三級菜單的“句柄”
MENU_Handle hMenuServer_2_3;//定義三級菜單的“句柄”

  4.創建一個函數“_AddMenuItem”用來創建一個個的菜單項;

static void _AddMenuItem(MENU_Handle hMenu, MENU_Handle hSubmenu, const char* pText, U16 Id, U16 Flags) 
{
  MENU_ITEM_DATA Item;
  Item.pText    = pText;
  Item.hSubmenu = hSubmenu;
  Item.Flags    = Flags;
  Item.Id       = Id;
  MENU_AddItem(hMenu, &Item);
}

  以上可以看出,函數“_AddMenuItem”是通過“MENU_AddItem”這個emWin庫函數來進行創建一個個的菜單項,而其中的傳遞參數,“hMenu”是這個菜單項的“句柄”,“&Item”是包含這個菜單項信息的“MENU_ITEM_DATA”結構的指針。“MENU_ITEM_DATA”結構解釋如下所示:

  5.創建函數“_CreateMenu”,用來創建所有的菜單項;

static void _CreateMenu(WM_HWIN hParent) {
  hMenu = MENU_CreateEx(0, 0, 0, 0, WM_UNATTACHED, 0, MENU_CF_HORIZONTAL, ID_MENU);
  hMenuServer = MENU_CreateEx(0, 0, 0, 0, WM_UNATTACHED, 0,     MENU_CF_VERTICAL, 0);
  hMenuSupply = MENU_CreateEx(0, 0, 0, 0, WM_UNATTACHED, 0,     MENU_CF_VERTICAL, 0);
  hMenuProcess = MENU_CreateEx(0, 0, 0, 0, WM_UNATTACHED, 0,     MENU_CF_VERTICAL, 0);
  hMenuServer_2 = MENU_CreateEx(0, 0, 0, 0, WM_UNATTACHED, 0,     MENU_CF_VERTICAL, 0);

  _AddMenuItem(hMenuServer_2, 0, " 能量 ", ID_MENU_SERVER_2_1, 0);
  _AddMenuItem(hMenuServer_2, 0, " 時間 ", ID_MENU_SERVER_2_2, 0);
  _AddMenuItem(hMenuServer_2, 0, " 事件 ", ID_MENU_SERVER_2_3, 0);
    
  _AddMenuItem(hMenuServer, 0, " 故障 ", ID_MENU_SERVER_1, 0);
  _AddMenuItem(hMenuServer, hMenuServer_2, " 狀態>", ID_MENU_SERVER_2, 0);
  _AddMenuItem(hMenuServer, 0, " 調試 ", ID_MENU_SERVER_3, 0);
  _AddMenuItem(hMenuServer, 0, " 存儲 ", ID_MENU_SERVER_4, 0);
    
  _AddMenuItem(hMenu, hMenuServer, " 服務 ", ID_MENU_SERVER, 0);
  _AddMenuItem(hMenu, hMenuSupply, " 驅動 ", ID_MENU_SUPPLY, 0);
  _AddMenuItem(hMenu, hMenuProcess, " 工藝 ", ID_MENU_PROCESS, 0);
  FRAMEWIN_AddMenu(hParent, hMenu);
  MENU_SetFont(hMenu, &GUI_FontHZ24);
  MENU_SetFont(hMenuServer, &GUI_FontHZ24);
  MENU_SetFont(hMenuServer_2, &GUI_FontHZ24);
}

  6.在FRAMEWIN(視窗)小工具的回調函數中,添加菜單消息處理部分,自此就全部完成了。

switch(pMsg->MsgId)
  {
  case WM_MENU:
    pData = (MENU_MSG_DATA *)pMsg->Data.p;
    switch (pData->MsgType)
      {
      case MENU_ON_ITEMACTIVATE:break;
      case MENU_ON_ITEMPRESSED:break;
      case MENU_ON_ITEMSELECT:
      switch (pData->ItemId)
        {
        case ID_MENU:break;
        case ID_MENU_SERVER:break;
        case ID_MENU_SERVER_1:MENU_STATE=1;break;
        case ID_MENU_SERVER_2:break;
        case ID_MENU_SERVER_3:MENU_STATE=2;break;
        case ID_MENU_SERVER_4:MENU_STATE=3;break;
        case ID_MENU_SERVER_2_1:MENU_STATE=4;break;
        case ID_MENU_SERVER_2_2:MENU_STATE=5;break;
        case ID_MENU_SERVER_2_3:MENU_STATE=6;break;
        case ID_MENU_SUPPLY:MENU_STATE=7;break;
        case ID_MENU_PROCESS:MENU_STATE=8;break;
        default:break;
        }
        break;
    default:WM_DefaultProc(pMsg);
  }
WM_InvalidateWindow(hFrame);break;

問題二:MENU(菜單)小工具點按之後沒有反應?

答:如果在配置都正確的情況下,那麼很有可能是在菜單消息處理完之後,沒有立即使相應界面顯示的視窗“無效化”-“WM_InvalidateWindow(hFrame);”。

 

問題二:MENU(菜單)小工具點按之後死機?

 

答:如果在配置都正確的情況下,那麼很有可能是在菜單消息處理函數中,沒有對內部消息進行處理,此時,只需要加上-“default:WM_DefaultProc(pMsg);”即可解決,具體的位置如問題一中最後一段代碼中所示。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一,獨立按鍵註意一下幾點 >按下的時候,電壓被拉低,所以IO口要傳低電平( 0x0 ) >按下的時候要消除抖動 ( 延時10ms ),在判斷,是否還是低電平,再做業務處理 下麵這段程式,就是通過一個獨立按鍵連接到p1口,控制靜態數位管的 一段 進行亮和滅的切換。 二, 當按鍵比較多的時候,用矩陣按鈕 ...
  • 本應該之前整理好的,又拖到現在,不管怎麼樣繼續堅持看下去,從二章開始就越來越不好理解了 整數運算 再次來看之前的一個例子: 還是通過這裡例子來看這個部分的知識點 無符號加法 無符號加法原理: 其實每次看到這種原理推導過程自己基本都不怎麼願意去看,不過我們可以通過實際的例子來好好理解,來幫助自己更好的 ...
  • vimtutor 返回normal模式: esc 移動游標 [h,j,k,l]: h 向左移動 j 向下移動 k 向上移動 l 向右移動 不保存便退出編輯器: :q! 刪除游標所在的字元: x 插入字元: i 結尾處插入字元: a 保存文件並退出: :wq 刪除操作: dw(until the st ...
  • 在redis.conf中,在大概65行左右有個loglevel # 指定日誌記錄級別# Redis總共支持四個級別:debug、verbose、notice、warning,預設為verbose# debug 記錄很多信息,用於開發和測試# varbose 有用的信息,不像debug會記錄那麼多# ...
  • ref:ttps://mp.weixin.qq.com/s_biz=MzI4Njg5MDA5NA==&mid=2247484231&idx=1&sn=4cf217a4d692a7aba804e5d96186b15b&chksm=ebd74246dca0cb5024de2f1d9f9e2ecb631e ...
  • 目錄:基礎準備 安裝elasticsearch 安裝 kibana 安裝logstash X-pack插件的安裝 登錄網頁查看 ELK名字解釋 ELK就是ElasticSearch + LogStash + Kibana,這三者是核心套件,但並非全部。 Elasticsearch是個開源分散式搜索引 ...
  • 適合初學linux的人學得比較凌亂的人看這個也能理理思路學得更系統,節約你的學習時間,提高效率 但是思維導圖的作用僅僅是幫人理清思路不會陷入細節中暈掉,細節補充學習請參考http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html以及鳥叔的 ...
  • 適合初學linux的人學得比較凌亂的人看這個也能理理思路學得更系統,節約你的學習時間,提高效率,但是思維導圖的作用是幫人理清思路不會迷失在細節中,細節補充學習請參考https://www.cnblogs.com/peida/archive/2012/12/05/2803591.html以及鳥叔的Li ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...