胖纸带你嘿嘿嘿

一个搞嵌入式开发的胖纸

emWin及StemWin使用中关于菜单栏的应用与问题

前言:在我看来,emWin和StemWin就是基本相同的库文件,关于这个库文件的移植,网络上有很多教材,比如“ALIENTEK emWin开发手册”,他们家提供了各种STM32系列的开发手册,我这里记录的是关于使用“窗口对象(小工具)”中的“MENU(菜单)”这类小工具在应用过程中,遇到的问题进行记录,并且提出我的解决方案。

emWin及StemWin使用中关于菜单栏的应用与问题 嵌入式 第1张


问题一:MENU(菜单)小工具如何使用?

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

#include "MENU.h"s

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”结构解释如下所示:

emWin及StemWin使用中关于菜单栏的应用与问题 嵌入式 第2张


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);”即可解决,具体的位置如问题一中最后一段代码中所示。


  • 评论列表:

发表评论:

Powered By itdoy

Copyright itdoy . All Rights Reserved.备案号:琼ICP备15000663号-1