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

emWin及StemWin使用中关于菜单栏的应用与问题的更多相关文章

  1. uCgui和emWin的区别

              在国内做嵌入式系统的,开始入门OS的时候,大家应该都会选择uC/OS,为什么?因为代码开源且资料众多嘛.由于uC/OS的原因大家也一定接触了uC/GUI的嵌入式图形软件库.其实uC ...

  2. [STemWin教程入门篇] 第一期:emWin介绍

    转自:http://bbs.armfly.com/read.php?tid=1544 SEGGER公司介绍 了解emWin之前,先了解一下SEGGER这家公司,了解生产商才能对emWin有更加全面的认 ...

  3. QC学习二:QC使用中问题点汇总

    QC 使用中问题点汇总,包括以下方面: 1.不兼容IE7,IE8的问题(服务器端设置) 2.无法在Win 7下正常下载页面(客户端设置) 3.在QC中填写中文内容后无法正常提交到数据库(客户端设置) ...

  4. 四轴飞行器1.6 emwin与ucgui的移植,汉字外挂字库移植和DEMO效果对比

    飞控的遥控器打算自己做,这样全局都能掌握,可以通过遥控器对飞控的参数和飞行模式进行修改,而买遥控器是做不到这样的哈..以后做图传的时候,屏幕还可以实时现实摄像头拍回来的画面,挺好的哈.. 做遥控我们选 ...

  5. QC使用中问题点汇总

    QC 使用中问题点汇总,包括以下四个方面: 1.不兼容IE7,IE8的问题(服务器端设置) 2.无法在Win 7下正常下载页面(客户端设置) 3.在QC中填写中文内容后无法正常提交到数据库(客户端设置 ...

  6. 【分享】【原创开源应用第4期】给ili9488,RA8875类显示屏的emWin底层增加DMA加速方案

    说明:1.emWin底层中最重要的一个优化就是16bpp绘制,特此为其增加DMA加速,已经支持RA8875和ili9488.2.使用中务必将emWin任务设置为除了空闲任务,统计任务以外的最低优先级, ...

  7. 【安富莱专题教程第1期】基于STM32的硬件RGB888接口实现emWin的快速刷新方案,32位色或24

    说明:1. 首先感谢ST终于推出了ARGB格式的emWin库,可谓千呼万唤始出来,使用STM32的硬件RGB888接口刷新图片慢的问题终于得到解决.2. 这个问题由来已久,是之前为我们的STM32-V ...

  8. 第2章 初学 emWin 的准备工作及其快速上手

    以下内容转载自安富莱电子论坛:http://forum.armfly.com/forum.php?mod=viewthread&tid=24552&extra=page%3D3%26f ...

  9. Qt的安装和使用中的常见问题(简略版)

    对于喜欢研究细节的朋友,可参考Qt的安装和使用中的常见问题(详细版). 目录 1.引入 2.Qt简介 3.Qt版本 3.1 查看安装的Qt版本 3.2 查看当前项目使用的Qt版本 3.3 查看当前项目 ...

随机推荐

  1. Android并发编程 原子类与并发容器

    在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的. 前言 上一篇博文中,主要说了些线程以及锁的东西,我们大多数的并发开发需求,基本上可以用synch ...

  2. UML介绍--用例图

    用例图定义:由参与者(Actor).用例(Use Case)以及它们之间的关系构成的用于描述系统功能的静态视图称为用例图. 用例图(User Case)是被称为参与者的外部用户所能观察到的系统功能的模 ...

  3. Kafka项目实战-用户日志上报实时统计之编码实践

    1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践>  该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块.消费模块,数据持久化,以及应用调 ...

  4. linux装tomcat遇到的坑

    最开始通过apt-get安装,各种毛病 然后下载tar.gz压缩包解压使用,运行startup.sh可以启动,但是看日志发现 Tomcat启动时卡在 INFO HostConfig.deployDir ...

  5. 一直性hash解决扩容后的hash算法不用变

    转自: http://blog.codinglabs.org/articles/consistent-hashing.html 摘要 本文将会从实际应用场景出发,介绍一致性哈希算法(Consisten ...

  6. [PHP] 算法-把数组排成最小的数的PHP实现

    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 解法1 1.数组排序, ...

  7. c++: Does the new operator for dynamic allocation check for memory safety?

    Quesion: My question arises from one of my c++ exercises (from Programming Abstraction in C++, 2012 ...

  8. c语言学习笔记-do......while

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.do......while函数意义 循环执行(人机交互) 二.do......while函数结构 do{ 语句1: 语句2: ...

  9. Python 练习:三级菜单选择城市

    info = { 'GuangDong':{ 'GuangZhou': ['TianHe', 'HaiZhu'], 'MaoMing': ['MaoNan', 'DianBai']}, 'ShanDo ...

  10. logo.ico在html网页中的实现

    <!doctype html><html> <head> <meta charset="utf-8"/> <title> ...