发新帖我要提问
12
返回列表
打印

请大家帮忙-关于菜单程序的实现

[复制链接]
楼主: pangshen
手机看帖
扫描二维码
随时随地手机跟帖
21
pangshen|  楼主 | 2010-1-13 15:31 | 只看该作者 回帖奖励 |倒序浏览
还是要谢谢楼上得。虽然不是想要的答案

使用特权

评论回复
22
xiaoxin1986| | 2010-1-13 17:50 | 只看该作者
都快一个月了,还没找到答案?

使用特权

评论回复
23
pangshen|  楼主 | 2010-1-14 13:37 | 只看该作者
是呀。所以很着急呀

使用特权

评论回复
24
chenfengmcu| | 2010-1-14 15:35 | 只看该作者
我做过和这个差不多的,我的思路是:我归类同级菜单是一个数组,上下级菜单用响应按键后指针引导。每一级菜单数组有一个显示函数(Paint)
和一个消息处理函数(MegProc),和位置.窗口大小.菜单用的图标等组成菜单组结构。 这样做的好处是菜单可以做成任意样式只要重写(Paint)
通过MegProc来响应菜单的间的切换,因为菜单结构定义了选择项等,所以按键响应就只修改选择项的值,而重绘还是在(Paint)函数内实现。
这样菜单比较清楚方便。


1定义菜单结构:
//菜单结构
typedef struct
{
    INT8U           x;           //菜单框架左上角X坐标
    INT8U           y;           //菜单框架左上角Y坐标
    INT8U           width;       //菜单框架宽度
    INT8U           height;      //菜单框架高度

    INT8U         itemTop;       //显示菜单框中最上面项
    INT8U         sItem;         //当前选择项
    INT8U         itemMax;       //最大顶数

    const char    *title;        //菜单标题
    const BMP     **pbmp;        //菜单项位图列表
    const char    ***ptext;      //菜单项文本列表

    void(*Paint)(void);          //重绘菜单
    void(*MegProc)(INT8U);       //消息处理
}MENU;

2使用

//定义菜单文本  有几个定义几个
const char **MMenuText[] ={}
//定义菜单位图列表
const BMP   *MMenuBmp[] ={ }
//定义菜单项
MENU MMenu=
{
   0,
   0,
   128,
   48,
   0,
   0,
   4,
   "Main menu",
   MMenuBmp,
   MMenuText,
   GUI_MenuBmpPaint,
   MMegProc
};
通过以上就做好同一级菜单的数据  
//实现菜单的绘制
void GUI_MenuBmpPaint()
//响应按键操作
void MMegProc (keyval)
{
     如 同级+-选 择 {重设 选择项参数等};
    上下级 是通过 全局菜单指针来指向当前是菜单组;
    刷新菜单 (全局的当前菜单指针->Paint);
}

这样做好处在于定义好框架,内容自定义移植方便,样式多样。望对你有用。

使用特权

评论回复
25
pangshen|  楼主 | 2010-1-14 15:53 | 只看该作者
24# chenfengmcu
首先,谢谢你!虽然我还没有仔细看你写的,所以不知道你写的跟我程序的契合度,但是我还是要谢谢你!因为我就是想要一个人给我一个思路。因为我刚刚毕业,刚刚开始工作,而且之前也没有编过程序。所以很多在大家认为是很简单的问题,对我来说可能都需要很多天才能琢磨明白。当然我知道,做任何事都需要迈出第一脚,我也做好了准备去迈出这一脚,并且也相信在不久的将来我也可以对于别人提出的疑问给与解答,但是我需要在我迈出这第一步的时候,有一个指引的方向。而这个指引的方向也正是高手之于新手们的最重要的,也是新手们所最需要的吧。说了很多废话,看程序去喽。:victory:

使用特权

评论回复
26
juventus9554| | 2010-1-16 22:55 | 只看该作者
24楼兄弟很热情啊

使用特权

评论回复
27
午夜粪车| | 2010-1-16 23:22 | 只看该作者
从你眼中觉得看程序都是快乐的事,真是羡慕

使用特权

评论回复
28
SLEET1986| | 2010-2-24 13:28 | 只看该作者
24楼的换可以哦

使用特权

评论回复
29
自然的天逸| | 2010-2-24 19:33 | 只看该作者
我写个 几个菜单程序是用 指针数组分的层次 以树目录的写法 利用一个变量做菜单索引 没有你这么多按键不过可以扩展的
*--------------文件信息--------------------------------------------------------
****************************************************************************************
* 文件名:Show.h
* 功能:界面显示菜单
* 作者:自然的天逸
* 日期:2009.02.05
* 备注:小厨师每一个图层显示界面包括三函数一个显示函数一个重绘函数 和一个销毁函数
****************************************************************************************/
#include "UCOSconfig.h"
INT8U        MenuLayer=0;                                /*菜单层数*/       
/*三个按键对应三个函数还有一个位自动函数*/
const        MenuStructure  MenuTab[][4]={
/*                活动A按键                   活动B按键            活动C按键           系统自动调用                                        当前菜单层数                */
   {(*KeySwitchA1),                (*KeySwitchB1),                (*KeySwitchC1),                (*SystemTask)},                                /***0***/       
   {(*KeySwitchA2),                (*KeySwitchB2),                (*KeySwitchC2),                (*SystemTask2)},                        /***1***/
   {(*KeySwitchA2_1),        (*KeySwitchB2_1),        (*KeySwitchC2_1),        (*SystemTask2_1)},                        /***2***/
   {(*KeySwitchA2_3),        (*KeySwitchB2_3),        (*KeySwitchC2_3),        (*SystemTask)},                                /***3***/
   {(*KeySwitchA2_4),        (*KeySwitchB2_4),        (*KeySwitchC2_4),        (*SystemTask2_4)},                        /***4***/
   {(*KeySwitchA2_5),        (*KeySwitchB2_5),        (*KeySwitchC2_5),        (*SystemTask)},                                /***5***/
   {(*KeySwitchA2_6),        (*KeySwitchB2_6),        (*KeySwitchC2_6),        (*SystemTask2_6)},                                /***6***/
   {(*KeySwitchA2_7),        (*KeySwitchB2_7),        (*KeySwitchC2_7),        (*SystemTask)},                                /***7***/
   {(*KeySwitchA2_H),        (*KeySwitchB2_H),        (*KeySwitchC2_H),        (*SystemTask)},                                /***8***/
   {(*KeySwitchA3),                (*KeySwitchB3),                (*KeySwitchC3),                (*SystemTask3)},                        /***9***/
   {(*KeySwitchA3_E),        (*KeySwitchB3_E),        (*KeySwitchC3_E),        (*SystemTask)},                                /***10***/
   {(*KeySwitchA3_F),        (*KeySwitchB3_F),        (*KeySwitchC3_F),        (*SystemTask)},                                /***11***/
   {(*KeySwitchA4),                (*KeySwitchB4),                (*KeySwitchC4),                (*SystemTask4)},                        /***12***/
   {(*KeySwitchA4_A),        (*KeySwitchB4_A),        (*KeySwitchC4_A),        (*SystemTask)},                                /***13***/
   {(*KeySwitchA4_B),        (*KeySwitchB4_B),        (*KeySwitchC4_B),        (*SystemTask)},                                /***14***/
   {(*KeySwitchA5),                (*KeySwitchB5),                (*KeySwitchC5),                (*SystemTask5)},                        /***15***/
   {(*KeySwitchA6_1),        (*KeySwitchB6_1),        (*KeySwitchC6_1),        (*SystemTask6_1)},                        /***16***/
   {(*KeySwitchA7),                (*KeySwitchB7),                (*KeySwitchC7),                (*SystemTask7)},                        /***17***/
   {(*KeySwitchA9),                (*KeySwitchB9),                (*KeySwitchC9),                (*SystemTask)},                                /***18***/
   {(*KeySwitchA10),        (*KeySwitchB10),        (*KeySwitchC10),        (*SystemTask)},                                /***18***/
   {(*KeySwitchA11),        (*KeySwitchB11),        (*KeySwitchC11),        (*SystemTask11)},                        /***20***/
   {(*KeySwitchA11_1),        (*KeySwitchB11_1),        (*KeySwitchC11_1),        (*SystemTask11_1)},                        /***21***/
   {(*KeySwitchA11_2),        (*KeySwitchB11_2),        (*KeySwitchC11_2),        (*SystemTask11_2)},                        /***22***/
   {(*KeySwitchA12),        (*KeySwitchB12),        (*KeySwitchC12),        (*SystemTask)},                                /***23***/
   {(*KeySwitchA13),        (*KeySwitchB13),        (*KeySwitchC13),        (*SystemTask13)},                        /***24***/
   {(*KeySwitchA13_1),        (*KeySwitchB13_1),        (*KeySwitchC13_1),        (*SystemTask)},                                /***25***/
   {(*KeySwitchA14),        (*KeySwitchB14),        (*KeySwitchC14),        (*SystemTask14)},                        /***26***/
   {(*KeySwitchA15),        (*KeySwitchB15),        (*KeySwitchC15),        (*SystemTask)},                                /***27***/
   {(*KeySwitchA16),        (*KeySwitchB16),        (*KeySwitchC16),        (*SystemTask16)},                        /***28***/
   {(*KeySwitchA16_2),        (*KeySwitchB16_2),        (*KeySwitchC16_2),        (*SystemTask)},                                /***29***/
   {(*KeySwitchA17),        (*KeySwitchB17),        (*KeySwitchC17),        (*SystemTask17)},                        /***30***/
   {(*KeySwitchA18),        (*KeySwitchB18),        (*KeySwitchC18),        (*SystemTask)},                                /***31***/
   {(*KeySwitchA19),        (*KeySwitchB19),        (*KeySwitchC19),        (*SystemTask19)},                        /***32***/
   {(*KeySwitchA19_1),        (*KeySwitchB19_1),        (*KeySwitchC19_1),        (*SystemTask)},                                /***33***/
   {(*KeySwitchA20),        (*KeySwitchB20),        (*KeySwitchC20),        (*SystemTask20)},                        /***34***/
   {(*KeySwitchA21),        (*KeySwitchB21),        (*KeySwitchC21),        (*SystemTask)},                          /***35***/
   {(*KeySwitchA22),        (*KeySwitchB22),        (*KeySwitchC22),        (*SystemTask)}                          /***36***/
};

/*************************************************按键处理菜单入口函数*****************************
        函数名:        MenuEntry
       
        功能        : 菜单程序入口程序 根据当前的菜单层找到 对应执行函数
       
        输入参数        :INT8U event 登入程序的入口事件
       
        输出参数:        无
       
        返回        :        无
*************************************************************************************************/       
void MenuEntry(INT8U event)
{       
        void (*temp)();
                switch(event)                               
                {
                        case KeyA:                        /*活动按键A*/
                        {
                               
                                temp=MenuTab[MenuLayer][0].State;        //找到当前索引对应的执行函数
                                (*temp)();                                //执行对应操作
                        }
                                break;       
                        case KeyB:                        /*活动按键B*/
                        {
                                temp=MenuTab[MenuLayer][1].State;        //找到当前索引对应的执行函数
                                (*temp)();                        //执行对应操作
                        }
                                break;               
                        case KeyC:                        /*活动按键C*/
                        {
                                temp=MenuTab[MenuLayer][2].State;        //找到当前索引对应的执行函数       
                                (*temp)();                        //执行对应操作
                        }
                                break;
                        default:
                        {
                                temp=MenuTab[MenuLayer][3].State;        //找到当前索引对应的执行函数       
                                (*temp)(event);                        //执行对应操作       
                        }       
                                        break;
                }                                                                               
}

具体可以联系我 QQ260573569

使用特权

评论回复
30
自然的天逸| | 2010-2-24 19:34 | 只看该作者
这个是个大概结构

使用特权

评论回复
31
自然的天逸| | 2010-2-24 19:41 | 只看该作者
层次 分的很清楚每一个函数对应每一层按键执行的功能 维护移值是很方便的 。各个功能相对独立

使用特权

评论回复
32
太阳很能| | 2010-4-5 21:59 | 只看该作者
没看懂

使用特权

评论回复
33
linhai2009| | 2010-4-6 11:58 | 只看该作者
这些程序都不错啊,收下了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则