在我看來,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);”即可解決,具體的位置如問題一中最後一段代碼中所示。