搜索
bottom↓
回复: 131

【菜单架构讨论】所有页面同一个级别好还是分层次按逻...

  [复制链接]
(217522356)

出0入0汤圆

发表于 2014-5-27 10:42:36 | 显示全部楼层 |阅读模式
以前折腾过好多菜单,在12864和2.2‘ TFT上都弄过,每次都是按照实际的菜单内容,重新设计一个菜单显示、参数等的架构。

最近想总结一下,发现以前写的菜单可以归为2类:

一类是所有的页面都放到同一个级别,编号,然后各个调用。如下图所示:

优点:添加,删除某个页面非常的简单。
缺点:页面间关联性不强,逻辑性差。




第二类:按照菜单本来的结构,分层写。如下图所示:

优点:逻辑性强,每个菜单的进入和返回都有子、父菜单及编号。
缺点:增添、删除页面时改动较大。




以上菜单实现方法:用switch case 语句。


1、大家都用什么方法写菜单呢?小系统或小单片机上弄个GUI确实没必要,所以菜单这个东西经常都会碰到。每次写法都不同,真是烦人啊。

2、我的这两种写法哪个比较好呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(217521638)

出0入0汤圆

发表于 2014-5-27 10:54:34 | 显示全部楼层
19264上面搞菜单,是和你的第二个方法一样, 没有太好的办法,这个事情,本身就是这德性; 菜单内的数据交互, 按键交互,页面之间的逻辑; 嗨,依然在探索中;
(217520346)

出0入0汤圆

 楼主| 发表于 2014-5-27 11:16:06 | 显示全部楼层
kinsno 发表于 2014-5-27 10:54
19264上面搞菜单,是和你的第二个方法一样, 没有太好的办法,这个事情,本身就是这德性; 菜单内的数据交互, 按 ...

嗯,第二个方法我觉得页面小于20个还好点,但多了 页面 进入 返回,父子菜单跳转太费劲了。如果删除某个页面,得层层深入到该层后,再删除相应语句。


前年弄了一个100个多页面的菜单,采用的是方法1,按照目前的情况来看,效果还可以。

最近又增加了几个页面,程序好久没动了,但是看了没多久就知道怎么添加了。
(217518010)

出0入0汤圆

发表于 2014-5-27 11:55:02 | 显示全部楼层
这个工具能共享下吗?
(217517728)

出0入0汤圆

发表于 2014-5-27 11:59:44 | 显示全部楼层
菜单少怎么都可以……稍多肯定是用第2种了。
我是统一用第2种
(217517727)

出0入0汤圆

发表于 2014-5-27 11:59:45 | 显示全部楼层
就第一种。

(217515014)

出0入0汤圆

 楼主| 发表于 2014-5-27 12:44:58 | 显示全部楼层
rootxie 发表于 2014-5-27 11:55
这个工具能共享下吗?

软件都是本坛下载的。我再传一下吧

共3个:
1、treemaker-需要注册
2、AVRmenu.exe(我的这个目录就是用这个做的)
3、MLMenu.exe


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(217514966)

出0入0汤圆

 楼主| 发表于 2014-5-27 12:45:46 | 显示全部楼层

嗯,现在感觉第一种非常的省心
(217512876)

出0入0汤圆

发表于 2014-5-27 13:20:36 | 显示全部楼层
guxingganyue 发表于 2014-5-27 11:16
嗯,第二个方法我觉得页面小于20个还好点,但多了 页面 进入 返回,父子菜单跳转太费劲了。如果删除某个 ...

其实我觉得第一个更烦人,我只使用2次,发现添加更烦人;
我更倾向于第二个,以功能为主线的画面来串联;  界面一直是个头疼事;
(217512696)

出0入0汤圆

 楼主| 发表于 2014-5-27 13:23:36 | 显示全部楼层
kinsno 发表于 2014-5-27 13:20
其实我觉得第一个更烦人,我只使用2次,发现添加更烦人;
我更倾向于第二个,以功能为主线的画面来串联;  界 ...

嗯,继续探索

寻找一种比较好的方法
(217511018)

出0入0汤圆

发表于 2014-5-27 13:51:34 | 显示全部楼层
guxingganyue 发表于 2014-5-27 12:44
软件都是本坛下载的。我再传一下吧

共3个:

MLMenu点生成C没反应。
AVRmenu生成的h文件没函数,怎么调用?
(217505524)

出0入0汤圆

 楼主| 发表于 2014-5-27 15:23:08 | 显示全部楼层
shower.xu 发表于 2014-5-27 13:51
MLMenu点生成C没反应。
AVRmenu生成的h文件没函数,怎么调用?

这个就不清楚了

我只拿这个软件来生成菜单图片,不使用它来编程

你可以在本坛找找相关使用方法
(217501954)

出0入0汤圆

发表于 2014-5-27 16:22:38 | 显示全部楼层
不知道lz是否看过windows menu,如果看过,可以采纳下!
说到菜单,这个东西确实是一个头痛的东西,不在于他复杂,而在于如何采用合适的菜单!

如果有时间,自己搞一个小的menu class,这个class功能不要太多,只要支持,固定菜单,编辑框,动态菜单就可以!

好多年前,我也做了这样的class,还能凑合着用,不是特别复杂的情况下,和windows menu一样。而且移植,添加菜单方便。

关键是菜单深度没有限制,而且菜单具有记忆功能,可以退到上级菜单,也可以直接退到任何想退的菜单。同时,资源耗的也不多,

每个菜单就耗16bytes。

(217494701)

出0入0汤圆

 楼主| 发表于 2014-5-27 18:23:31 | 显示全部楼层
mikal 发表于 2014-5-27 16:22
不知道lz是否看过windows menu,如果看过,可以采纳下!
说到菜单,这个东西确实是一个头痛的东西,不在于 ...

哇,这么好。对windows menu 没有接触过,xp下的菜单都挺好的

研究这个主要是在12864点阵下做个简单的界面,简单又实用。

如果架构非常的复杂,像gui一样的话,一般的小单片机估计就吃不消了。


能否把你的思路讲讲呢
(217444321)

出0入239汤圆

发表于 2014-5-28 08:23:11 | 显示全部楼层
菜单肯定是自动化的工具来做。现在还在手工做菜单的,都属于石器时代的开发方式。
(217442842)

出0入0汤圆

 楼主| 发表于 2014-5-28 08:47:50 | 显示全部楼层
mcu_lover 发表于 2014-5-28 08:23
菜单肯定是自动化的工具来做。现在还在手工做菜单的,都属于石器时代的开发方式。 ...

有这么先进的武器,从来没有用过啊

大哥推荐一个?
(217424957)

出0入0汤圆

发表于 2014-5-28 13:45:55 | 显示全部楼层
guxingganyue 发表于 2014-5-27 18:23
哇,这么好。对windows menu 没有接触过,xp下的菜单都挺好的

研究这个主要是在12864点阵下做个简单的界 ...

按照我目前的class和os架构,ram要2k,rom 就看资源了,code代码就1-2k;
思路就是,按照windows menu风格,createwindow,然后处理window消息,我们可以把menu看着是windows的;
看看windows的menu程序就明白!
(217424645)

出0入0汤圆

发表于 2014-5-28 13:51:07 | 显示全部楼层
mcu_lover 发表于 2014-5-28 08:23
菜单肯定是自动化的工具来做。现在还在手工做菜单的,都属于石器时代的开发方式。 ...

其实我比较反感类似您这样的语气否定手工菜单的用处!
给你一个rom8k,ram 2k,你去做做自动化菜单?
我在03就已经做自动化菜单了,但10多年过去了,我现在还依然在某些场合手工做菜单!

做技术,严谨点,对自己肯定有莫大的提升!

如果你还觉得nb,那么我就问你 iphone 消息通知pop menu 你去自动化给我看看?难道你会事先知道消息内容?

(217423838)

出0入0汤圆

 楼主| 发表于 2014-5-28 14:04:34 | 显示全部楼层
mikal 发表于 2014-5-28 13:51
其实我比较反感类似您这样的语气否定手工菜单的用处!
给你一个rom8k,ram 2k,你去做做自动化菜单?
我 ...

不要生气哦,大家好好讨论哈
(217423782)

出20入65汤圆

发表于 2014-5-28 14:05:30 | 显示全部楼层
我用的还是网上最原始的结构体方式,虽然用起来也不是很麻烦,但是跟按键搭配没什么好的思路。
假如这个菜单项里面有个需要输入的界面,就通过一个不断调用的函数来获取按键并处理,但是每一个界面都要这么做,显得很笨拙。

MenuItem SpeedSelectMenu[SPEEDSELECT_MENUCOUNT] =
{        //MenuCount,         ParentIndex,MenuString        ,MenuFunc,        SubMenu,ParentMenu
        {SPEEDSELECT_MENUCOUNT, 0, "速度1=     RPM", Gui_SelectCoef_Ns1, NULL, MainMenu},
        {SPEEDSELECT_MENUCOUNT, 0, "速度2=     RPM", Gui_SelectCoef_Ns2, NULL, MainMenu},
        {SPEEDSELECT_MENUCOUNT, 0, "速度3=     RPM", Gui_SelectCoef_Ns3, NULL, MainMenu},
        {SPEEDSELECT_MENUCOUNT, 0, "速度4=     RPM", Gui_SelectCoef_Ns4, NULL, MainMenu},
};
(217423598)

出0入0汤圆

 楼主| 发表于 2014-5-28 14:08:34 | 显示全部楼层
mikal 发表于 2014-5-28 13:45
按照我目前的class和os架构,ram要2k,rom 就看资源了,code代码就1-2k;
思路就是,按照windows menu风 ...

大侠看看这个帖子中的内容,好像很有意思

http://www.amobbs.com/thread-4057882-1-1.html
(217421515)

出0入0汤圆

发表于 2014-5-28 14:43:17 | 显示全部楼层
U16  POP_MenuProcess(U32 ulmsg,U32 ulPara)
{
    U16 usResult = SOS_FALSE;

    switch(ulmsg)
    {  
        case E_MENU_OPEN:
        case E_MENU_PAINT:
        case E_MENU_TIME:
            break;
        default:
            Menu_Close();
            usResult = SOS_TRUE;
            break;
    }

    return usResult;
}

void POP_MenuBox(U8*pucStr)
{
    Menu_Create(POP_MenuProcess,pucStr,stPOP_Menu,1,E_MENU_STYTLE_POP_MENU);
}

POP_MenuBox("请确认是否删除");

就可以自动在lcd显示了,然后 类似弹出菜单都可以这样做
(217421324)

出0入0汤圆

发表于 2014-5-28 14:46:28 | 显示全部楼层
stPOP_Menu 是一个菜单资源,按照要求写!
const  stMenuConf stPOP_Menu[]=
{
    {E_MENU_POP_MUNE_ID,2,C_POP_STR,0}
};

C_POP_STR 是弹出菜单固定提示,比如我这里是:是,否!E_MENU_POP_MUNE_ID菜单唯一ID,2 此pop菜单显示行数!0是否有子菜单,如果有,就是子菜单结构体!
(217421173)

出0入0汤圆

发表于 2014-5-28 14:48:59 | 显示全部楼层
本帖最后由 mikal 于 2014-5-28 14:58 编辑

所有的按键消息都是通过 U32 ulmsg 传入,然后如果当前窗体不处理,可以直接交给后台窗体处理,如果当前处理,那先处理。处理后,如果还想叫
后台处理,就直接交给后台,这里通过 usResult 是 false还是true来判断!

比如pop窗体的
        case E_MENU_OPEN:
        case E_MENU_PAINT:
        case E_MENU_TIME:
消息都可以直接交给后台处理,那么就直接usResult=false;然后后台就处理:菜单的打开,刷新,定时处理;

这里 POP_MenuProcess, 就是pop窗体的实现,其把三个消息交给后台,剩下的所有信息来后,就直接自己处理,自己处理的结果就是把当前窗体close,退回上一级。

POP_MenuBox 就是封装好的弹出菜单函数,传入任何字符串就可以提示出
    xxxxx
是        否                的效果!然后按任意键取消这个pop 窗体!

这种情况下,你只要实现   
POP_MenuProcess
POP_MenuBox
后台窗体处理
Menu_Create
Menu_Close
这几个函数,就可以组织很多种菜单了。
当然,编辑窗体难度大些!
(217417864)

出0入239汤圆

发表于 2014-5-28 15:44:08 | 显示全部楼层
本帖最后由 mcu_lover 于 2014-5-28 15:54 编辑
mikal 发表于 2014-5-28 13:51
其实我比较反感类似您这样的语气否定手工菜单的用处!
给你一个rom8k,ram 2k,你去做做自动化菜单?
我 ...


2K RAM 做菜单,太阔绰了吧。
如果真有2K资源可以供菜单模块使用,菜单可以做的非常灵活,可以完全按照WINDOWS 菜单API来进行设计。什么动态添加删除,都可以实现。
问题是,真的需要这么大的资源来实现这些根本用不到的功能吗?
菜单设计不难,难的是整体的界面。菜单不过就是提供了一系列选择项供选择。真正的设置项,参数调整等等,这些都是菜单无法完成的。
所以组织界面的设计思路就要转换过来,菜单只属于界面设计里面的一个小模块。所以,开发带液晶显示的案子时候,首先要对自己讲。
这个案子的界面如何设计,而不是菜单如何设计。应该要以面向屏幕的思维来思考整个界面的设计:
我曾经花了大篇文章来介绍这类思想:
http://www.amobbs.com/thread-5543459-1-1.html

另外,回答您提出的问题:
POP 消息框显示动态内容很简单。因为所有的动态内容都是已知。不要告诉我您设计的程序,需要POP的内容不知道。只不过POP的内容可能
因为上下文的不同而内容不同。但所有内容都是可以预料的。对于动态的变量就更好处理了,直接把变量的值显示出来就OK 了。

为了说明我不是在这里夸夸其谈。我从我自己设计的工具中,随手抓了张图:

上面的pop消息框中,标题和提示信息都是可以动态改变的。所以动态的POP消息框不是很难,当然需要一定的思路和功底。

我之所以说诸位的方式还处于石器时代。是因为诸位经历过的过程,我都经历过。
正如上面2楼 kinsno 兄弟说的:
“19264上面搞菜单,是和你的第二个方法一样, 没有太好的办法,这个事情,本身就是这德性; 菜单内的数据交互, 按键交互,页面之间的逻辑; 嗨,依然在探索中”
界面设计的繁琐之处,不在于设计一个菜单,设计一个可以导航的菜单非常容易,难就难在具体的菜单功能处理上面。简单例子:
下面是一个菜单选择的条项:实现在下面的菜单项中进行导航选择,有N种方法。就不展开讲了

随便选中一个菜单项进入,这里选择通道1设置这个菜单项,看看进入通道1设置屏幕,会有什么:

我们这里可以看到,有三个值设置项,这这个屏幕画面里面,我们需要提供上下按键的导航,如按下 下 键,则光标(焦点)
移动到下一个值设置项。

而在实际的开发情况中,根据诸位涉及的项目的内容的不同,需要设置的项目可能非常之多,所以在这个画面里面,对于按键的处理
以及数据交互,其实是非常繁琐的。这也正是 kinsno  兄在2 楼发出此感慨的真正原因所在。只要真正开发了带液晶显示项目的兄弟,
我想他一定都会赞成此说法。

按下确定键,弹出数值输入对话框,用于设置相应的数值:

正如您所言,编辑框会复杂些,也确实如此。

我想看完了上面我写的这些文字,如果您还坚定不移的认为您手工开发的方式,是很先进的吗?
手工方式,只是对界面研究不深入的人在使用。
难道您要修改-烧录-看现象,再修改,再烧录。一个案子开发一个月,恐怕界面部分就占了二十多天。
自动化工具的方式,肯定与手工的方式,天壤之别。
当然也有一定的前提条件就是研究的够深入,能够自己编写自己需要的工具,有自己的一套设计思路。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(217413462)

出0入0汤圆

发表于 2014-5-28 16:57:30 | 显示全部楼层
本帖最后由 mikal 于 2014-5-28 17:01 编辑
mcu_lover 发表于 2014-5-28 15:44
2K RAM 做菜单,太阔绰了吧。
如果真有2K资源可以供菜单模块使用,菜单可以做的非常灵活,可以完全按照WI ...


看了你的回复,然后又看了您的另外一篇文章,觉得你在菜单方面确实已经很厉害了!起码是我目前看到在单片机领域比较牛的人!

当然了,其实我一直强调的是,你不要小瞧手工菜单,不要以为自动化菜单什么都能做。就像我不同意很多唯OS论的人一样,存在即合理。

做一个UI,从程序角度看,需要实现,资源,窗体(包含menu,list, box, edit ==),点线圆图等效果,驱动这4个部分;

我相信很多人说做菜单,肯定也是说要做这4部分。那么针对这4部分,首先 资源,肯定是自动化有优势,这个不需要强调;

但点线圆图等效果和驱动这个相对资源多,自己写,网上找,都可以。那么我相信难度大的在窗体这块。而窗体这块全部自动化是

不可能的。诚如您所说,做菜单,不是做界面,而是在做界面规划,那么界面规划不仅仅是字的摆放位置,显示几行这么简单吧!

既然界面风格多样变换,那么你自动化的程序除非做到可以支持任何风格或者会定制风格的能力,不然,你还的必须手动去填写

一些功能。但实际上任何风格就是无穷多,所以全世界还没有一个工具能支持全部自动化。

    为了提出我的质疑,就再回到你的pop中来,现在我一个系统中,可能用到无数次pop,而且每次都不一样的内容,针对这个,

我相信你自己写的pop已经可以支持,但,现在我还有一个特殊功能,就是在同一个父菜单下,其弹出一个pop,比如显示当前电压值,

然后3秒后,再显示电流值,随后提示成功或者失败。ok,假如你的程序中已经做了定时功能,可以在定时后自动切换到下一个pop,

对于这样的要求,我相信也可以自动化,但是,如果我还有一个要求,那就是,如果电压,或者电流是非0才弹出相应pop!基于这样的

情况,按照正常是弹出电压,但是由于电压没有值,就直接弹电流,这个时候,如果电流也没有,可能就直接显示失败,针对这样的情况

你的自动化还能用吗?

    从02开始到现在,点阵lcd的菜单项目我做了10多个,不敢说我自己做的windows class多好,不过在移植方面那是洒洒水,什么cpu,

什么lcd,什么不同界面。都是不用花什么时间但,但是,有时候必须得改写函数,才能实现。

    从03年到08,做过6年的手机 UI,见过无数商用级别gui,展讯,mtk,朗讯 == ,而且都能自动化菜单和资源,但是,很多菜单必须修改!

  而且展讯的窗体类做应该最好!

   另外我说的8krom 2ram 是指一个单片机的容量,不仅仅针对菜单!

(217411689)

出0入0汤圆

发表于 2014-5-28 17:27:03 | 显示全部楼层
mark。。。
(217411662)

出0入239汤圆

发表于 2014-5-28 17:27:30 | 显示全部楼层
mikal 发表于 2014-5-28 16:57
看了你的回复,然后又看了您的另外一篇文章,觉得你在菜单方面确实已经很厉害了!起码是我目前看到在单片 ...

看得出您对界面设计也是挺有研究的。那就接着往下讲吧。
首先有个观点,先摆在前面。咱们不抬杠。例如,黄金很贵重。如果遍地都是黄金,那不就等同泥土了。所以我们的讨论里不要出现这样的极端例子情况。
所以您说的自动化的工具不能适应所有的风格。这点我赞同。没有任何一种工具能够达到。就好比这个世上没有任何东西是完美的一样。

对于您提到的POP内容需要判断相应的变量的值才决定显示内容的情况。其实这已经与界面没有一毛钱的关系了。实现起来也不复杂。
界面设计讲究MVC模式,这样才能将界面与应用分离开来。您这个已经属于controller的范畴了。在自动化工具里面是通过脚本/宏实现的,非常的方便。
真正与界面解耦。如果您有兴趣,可以多了解一下这方面。很多东西还是很有意思的。

我之所以推崇工具,是因为可以大大提高工作效率。想象一下,在WINDOWS上面所见即所得的设计界面,效果通过模拟器立马可以见到。是不是比每次修改一点
然后手动调整坐标位置,编译,下载,烧录,效率要高出很多倍呢?

另外,您的界面设计的方式与我早期手工编码时候基本一致。都是基于消息的。
(217410513)

出0入0汤圆

发表于 2014-5-28 17:46:39 | 显示全部楼层
mcu_lover 发表于 2014-5-28 17:27
看得出您对界面设计也是挺有研究的。那就接着往下讲吧。
首先有个观点,先摆在前面。咱们不抬杠。例如, ...

红金龙,你啥也不说了,  看来你的文本设计器是成功了撒! 你是有这东西,所以你说有自动化设计,  但没有的人呢,可不就只能自己手动编码了,没有办法的;  谁都想把这种菜单给做成一种自己特制的工具,最关键的是,可能一年也就1-2个项目涉及这种界面,谁去弄它呢?

PS : 最后想说一句, 界面这个东西, 做少了是设计不出来一个好工具的,必须做多了,做深刻了,才有领悟,然后设计出一个适合于自己或适合于部分领域特定应用的工具;  所以, 好多攻城狮依然处在石器时代;
(217409962)

出0入0汤圆

发表于 2014-5-28 17:55:50 来自手机 | 显示全部楼层
本帖最后由 zhwm3064 于 2014-5-28 17:58 编辑

我不知道用的是楼主哪个方法。 我的菜单既可以自动添加也可以手动添加。 自动添加在某些层次上会不尽人意,这时就会手动更改部分。
采用结构体数组形式:
{菜单1 序号 按上键进入 按下键进入 返回键进入 确认键进入 当前层执行的程序
......
}
(217388054)

出0入0汤圆

发表于 2014-5-29 00:00:58 | 显示全部楼层
mcu_lover 发表于 2014-5-28 17:27
看得出您对界面设计也是挺有研究的。那就接着往下讲吧。
首先有个观点,先摆在前面。咱们不抬杠。例如, ...

看过你写的一些有关菜单的文章,恕我直言,感觉里面讲的不是很清楚,最好能来点儿干货,比如你的菜单开发工具,详细的框架(简单的demo)。
(217342100)

出0入0汤圆

发表于 2014-5-29 12:46:52 | 显示全部楼层
本帖最后由 mikal 于 2014-5-29 12:52 编辑
mcu_lover 发表于 2014-5-28 17:27
看得出您对界面设计也是挺有研究的。那就接着往下讲吧。
首先有个观点,先摆在前面。咱们不抬杠。例如, ...




其实,我没有抬杠,也不想抬杠,而且我从没有否认工具不好!

我和你争论的是,你说手工菜单还是石器时代,而我不认同!

就像很多现在高级语言工程师,都很藐视c语言一样,觉得c语言过时了,但是,你看看,到现在c语言依然还很坚挺!

我们发扬新技术的同时,不要一味否定目前依然还比较使用的老技术!

另外,不要太自负别人所谓的手工菜单一定不如你所谓的自动化工具,你可以永远说自己第二,但千万不要以为自己第一,

学会用宽容,哲学的角度去看任何问题,你会发现,自己每天都在进步和成长!

就比如这个群里有一个arm的版主,在讨论 模块封装 一 中说到的方法,从我的角度去看,这仅仅是一种编程技巧,

值得我们去学习,但是从规避某些问题的时候,有比他更简单和直白的,c语言的static 早就想到的作用域的问题,还需要编程师

绞尽脑汁来设计作用域问题吗?也许写的高深些,花哨些,让人难懂点,就是技术高,那还不如写汇编或者机器代码更让人崇敬!

另外,越自动化,就意味着资源消耗大。这是一个不变的真理!

再说到mvc,我的观点就是 设计模式说白了就是 用瓶子能喝水,用葫芦也能喝水,只要能喝,就是用桶都行,关键是方式,

mvc就是把皮肉分开,独立操作,全局一个超级对象,完了。

那我说的也就完了。

(217337414)

出0入239汤圆

发表于 2014-5-29 14:04:58 | 显示全部楼层
mikal 发表于 2014-5-29 12:46
其实,我没有抬杠,也不想抬杠,而且我从没有否认工具不好!

我和你争论的是,你说手工菜单还是石器 ...

我已经走过了手工菜单的时代,也深知手工开发的效率的低下。
我在前面的几个楼层中已经讲述了,菜单开发与界面开发的关系,以及其中复杂的地方在哪里。
您有您的一套完整代码,我也相信其中大部分代码都是可以复用的。
但是您不得不承认,对于一个新的案子,您还是得重新规划界面的组织方式,如何在屏幕上绘制新的东西。
当然,对于菜单导航,POP消息框,数值编辑之类的,您肯定也都有现成的代码可以复用。问题是,除了这些。在您新的案子里,还是需要写大量“脏代码”,譬如处理不同界面的焦点导航。
您可以试一试,用您的手工方式,完成我上面楼层中截图的几个界面。对于菜单界面,一个导航函数就OK了,对于跳转到具体的设置画面之后,您的手工编码方式,处理起来复不复杂?

看看这个帖子的4楼,就是手工界面设计的典型代表。虽然代码不是很漂亮,但是思路是对的。
http://www.amobbs.com/forum.php? ... p;page=1#pid7574883

这也是我以前手工界面编写的时候,头疼的地方。即便是我的整个程序构架都是基于消息的,界面也是基于消息的。已经在一定程度上面,使得模块之间的耦合度降到最低。但是仍然
无法消除手工界面的开发效率之低下。

所以,我才开始琢磨如何提高界面开发的效率。在我看来,工程师应该是艺术家,界面开发应该是快乐的事情,而不是琐碎的,像绣花一样。所以才花大精力在自动化工具的设计上。
所以,从开发效率上面考虑,在我眼里现在看来,手工编码就是石器时代,费时费力,而工具开发才是现代化的方式。
我已经很难想象开发一个界面要花费数十天,烧写几百次MCU是多么可怕的梦魇了。

也许,我的语气给您的感觉太过自负。这点我向您说声抱歉。但也正是因为我曾经也走过手工编码的过程,又感受过工具开发的高效与方便,所以才会如此坚定不移的成为工具的拥趸。
我相信我与您的探讨,一定会让其它人受益良多。

(217325825)

出0入0汤圆

发表于 2014-5-29 17:18:07 | 显示全部楼层
本帖最后由 mikal 于 2014-5-29 17:31 编辑
mcu_lover 发表于 2014-5-29 14:04
我已经走过了手工菜单的时代,也深知手工开发的效率的低下。
我在前面的几个楼层中已经讲述了,菜单开发 ...


其实,你做到工具化,肯定值得我们去学习。但是,所谓手工,我们之间的认知可能不一样!

你给的链接,其思路压根不是我所认知的手工菜单范畴。我贴部分剥离的代码,你看看就知道了!


void Menu_Main(xxxx * Mess)
{
    U32 ulMsg, ulPara=0;
    stMenuConf * stMenu;
    /* key code  or other msg */
    ulMsg = (U32 )Mess->msg;
    stMenu =(G_stWin->stCurMenu+G_stWin->ucCurItem);
    ulPara = stMenu->usMenuID;
    if(G_stWin->fCallBack)
    {
        if(!G_stWin->fCallBack(ulMsg,ulPara))
        {
            Menu_DefaultPro(ulMsg,ulPara);
        }
    }
}

void Menu_DefaultPro(U32 ulmsg,U32 ulPara )
{
    switch(ulmsg)
    {
        case E_UI_KEY_0:
        case E_UI_KEY_1:
        case E_UI_KEY_2~9:
        默认多种风格菜单的数字键处理
        break;
                   
        case E_UI_KEY_OK:
        case E_UI_KEY_LEFT:
        case E_UI_KEY_RIGHT:
        case E_UI_KEY_UP:
        case E_UI_KEY_DOWN:
        case E_UI_KEY_FUN_1:
        case E_UI_KEY_FUN_2:
        case E_UI_KEY_FUN_3:
        默认多种风格菜单的功能,方向处理
        包括下级菜单进入等等
            break;
        case E_UI_KEY_RETURN:
        默认多种风格菜单的关闭
            Menu_Close();
            break;
        case E_MENU_OPEN:
        默认多种风格菜单的打开配置
        break;
        case E_MENU_PAINT:
         默认多种风格菜单的刷屏
            break;   
            case E_MENU_TIME:
            默认多种风格菜单的定时处理
            break;
            
        default:
            break;
    }
}

注意这里的Menu_DefaultPro就是你所谓的自动化功能处理。
而 G_stWin->fCallBack(ulMsg,ulPara) 就是我们需要特别的处理的地方。

所以只要没有特别的处理的地方 Menu_DefaultPro 基本就可以实现各种需求。

然后再配合工具或者手动的资源
const  stMenuConf stIdle_Menu[]=
{
{E_MENU_IDLE_ID,4,C_IDLE_STR,stMain_Menu,0},
};
const  stMenuConf stMain_Menu[]=
{
{E_MENU_MAIN_ID,48,C_MAIN_STR,0,0},
};

通常的菜单,我也就是加加资源。
当然,如果是完全不同大小的lcd,就需要调整刷新点位置,也许和你的自动化工具有差距。
但是,我只要开始做几类这样的范例,也就和你的工具相差无。
不过,我的手工菜单还有一个优点,那就是资源消耗一定比你的小,同时可以支持多种语言!




(217324500)

出0入0汤圆

发表于 2014-5-29 17:40:12 | 显示全部楼层
mikal 发表于 2014-5-29 17:18
其实,你做到工具化,肯定值得我们去学习。但是,所谓手工,我们之间的认知可能不一样!

你给的链接,其 ...

结构挺好,能开源不?
(217324494)

出0入0汤圆

发表于 2014-5-29 17:40:18 | 显示全部楼层
guxingganyue 发表于 2014-5-28 14:08
大侠看看这个帖子中的内容,好像很有意思

http://www.amobbs.com/thread-4057882-1-1.html ...

你提供的链接,我看了下,思路不错,可以去借鉴下! 类似这样的架构,其实做自动化工具,非常有优势。但是,另外一个缺点就是资源大!

想做这样的菜单,其实lz可以尝试自己写个自动化工具呗!
(217322171)

出20入65汤圆

发表于 2014-5-29 18:19:01 | 显示全部楼层
看这两位讨论收获还挺多的,但就是一时领悟不了
(217321538)

出0入0汤圆

发表于 2014-5-29 18:29:34 | 显示全部楼层
说了半天还是夸夸其谈,我是没有看到方法,起码给个简单的demo,也写过几个菜单比较麻烦,建议楼主学习ucgui吧,看看里面的编程思想,我正在看源码呵呵。
(217321200)

出0入0汤圆

 楼主| 发表于 2014-5-29 18:35:12 | 显示全部楼层
mikal 发表于 2014-5-29 17:40
你提供的链接,我看了下,思路不错,可以去借鉴下! 类似这样的架构,其实做自动化工具,非常有优势。但 ...

嗯,这个先定为远大的目标吧

现在一个上位机都不会,得先学习啊
(217321142)

出0入0汤圆

 楼主| 发表于 2014-5-29 18:36:10 | 显示全部楼层
tianheyun12 发表于 2014-5-29 18:29
说了半天还是夸夸其谈,我是没有看到方法,起码给个简单的demo,也写过几个菜单比较麻烦,建议楼主学习ucgu ...

gui占空间啊,小的单片机上跑不起gui啊
(217321038)

出0入0汤圆

 楼主| 发表于 2014-5-29 18:37:54 | 显示全部楼层
68336016 发表于 2014-5-29 18:19
看这两位讨论收获还挺多的,但就是一时领悟不了

那二位的内功很深

我只能慢慢的领悟
(217320444)

出0入0汤圆

发表于 2014-5-29 18:47:48 | 显示全部楼层
我认为,资源不紧张的时候,写程序宁愿代码量大些,RAM占多些,反正现在很多资源都用不完,用起来方便,快捷通用,程序员写程序时间少的程序最好,每次搞大量不同的,修改维护也麻烦,变成辛苦的是自己,不是单片机
(217320383)

出0入239汤圆

发表于 2014-5-29 18:48:49 | 显示全部楼层
mikal 发表于 2014-5-29 17:18
其实,你做到工具化,肯定值得我们去学习。但是,所谓手工,我们之间的认知可能不一样!

你给的链接,其 ...

您说的意思我明白。我给出的那个链接里面那个网友对设置界面的处理,虽然代码不够优雅,但是思路是对的。而不是菜单。
还有,有一点您一直都没有重视,就是整个界面设计,菜单只是一个很小很小的一个部分,真正占大头的的具体的各类设置界面啊。
我在上面的楼层中都贴图出来了。实现一个导航的菜单很简单,手工方式也确实只需要改改菜单项的字符串资源即可。
但是对于具体到菜单项对应的具体的屏幕里面了,您恐怕就不是该资源这么简单的事情啦。
不信,您可以说出您对具体的界面处理思路,而不是菜单。
您给出的处理流程,和我对菜单模块的处理基本一致。我就不贴代码了。我贴一个POPMSG 框的处理框架吧。相信您看了,就明白我的思路了。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(217319433)

出0入239汤圆

发表于 2014-5-29 19:04:39 | 显示全部楼层
有很多人喜欢一上来就问代码,其实不是学习的好办法,想想你自己电脑里面下载的资料这辈子加上下下辈子能不能够看的完吧。
别人的东西,始终是别人的,自己不动脑就想消化吸收,是不可能的,思路才能决定出路。
我学习的过程,都是根据别人提供的支离破碎的信息,然后提取关键字,再有针对性的寻找资料学习。
这个帖子里面已经提供了相当多的信息了,如果你认真做过界面开发,必然会从其中领悟出什么。否则,就算代码贴出来了,你也看不懂。
就好比 我与 mikal 的探讨,我自己本身也从他的发言中的某些言语片段,发现了我所欠缺的东西,对于我来说,也有收获。
所以这样的探讨才有具体的意义。一步一步来,才能引出更多有意思的东西来。
(217316215)

出0入0汤圆

 楼主| 发表于 2014-5-29 19:58:17 | 显示全部楼层
mcu_lover 发表于 2014-5-29 19:04
有很多人喜欢一上来就问代码,其实不是学习的好办法,想想你自己电脑里面下载的资料这辈子加上下下辈子能不 ...

说的好,思路就定出路

代码只是表现思路的一种形式,首先要把思路弄明白了

思路是建立在自己折腾过很多的代码,看过,用过别人的许多代码。。。。

突然有一天你就自觉地想总结一下以前写过的所有菜单的结构。


ls二位的菜单思想已经很高了,我得好好学习才能领会一点点啊。
(217315494)

出0入0汤圆

发表于 2014-5-29 20:10:18 | 显示全部楼层
哈哈,学习一下
(217299382)

出0入0汤圆

发表于 2014-5-30 00:38:50 | 显示全部楼层
学习来了,看mcu_lover的好多帖子,正在努力学习
(217270092)

出0入0汤圆

 楼主| 发表于 2014-5-30 08:47:00 | 显示全部楼层
donglaile 发表于 2014-5-30 00:38
学习来了,看mcu_lover的好多帖子,正在努力学习

个个都是经典啊

(217260463)

出0入0汤圆

发表于 2014-5-30 11:27:29 | 显示全部楼层
mcu_lover 发表于 2014-5-29 18:48
您说的意思我明白。我给出的那个链接里面那个网友对设置界面的处理,虽然代码不够优雅,但是思路是对的。 ...

首先肯一点,在对菜单的设计娴熟度上,你现在肯定比我强多了,其实我不做系统菜单起码有5年了,现在也仅仅是凭记忆来讲讲!
但是,我的观点依然不变,你不要把手工菜单比作石器时代!

1、针对你的代码,我要表扬下你,不错的风格,另外再提个小建议,以后把常量放在变量前比较,你会发现用处很大:)
2、针对你说我对界面的整体设计避而不谈,其实不是我没有重视,而是因为我以为在此帖,其实没有太多必要去深入探讨,为什么呢?
     因为,我开始就把这次的界面设计定格在单片机,点阵小lcd,小资源,简单菜单的范畴。不过你一再强调,我也就讲讲我的看法,虽然远离
    菜单界面设计好多年了,但是整体思路应该还是有一些,不过说的不对,请指正。
     在我以往的设计中,我们在菜单方面的设计一共走了2条路,一条是欧美方式,一条是印度方式。
    a、印度方式,典型国内使用的是mtk,这个方面我涉及不是特别深,但是它的特点和我们一般接触到的不一样,其表现在,所有的消息处理
         都单独写出一个公共函数〔这些函数就是一些链表指针的调用〕,然后通过这些函数在不同界面来注册这些消息,同时注册这些消息的处理回调函数;
        这类函数几乎都可以通过自动化工具全部完成,另外 针对menu的划分其很简单,就是以screen为单位,事先自动化完成了很多个不同类型的screen,
        然后,自动化工具的时候,根据不同需求,填写这些screen的ID就可以。另外,其还提供一套自定义screen的函数,共开发者自行定义。印度式菜单
        的思路,其实就是事先做一些菜单消息处理的公共函数,然后做了一些参考的screen,其本身和我们普通写菜单思路一样,无非其做了很多归类和
        工具化,这样更加便捷,但是对于小型系统,参考意义不是特别大!
   b、欧美式,其体现的就是windows的方式,首先以windows为一个基本单元,然后在任何一个windows中,可以加载如下一些控件:list ,message box,
        edit,title ,label,menu,softkey 等等。比如我现在要显示一个菜单,那么首先,创建一个windows  ,然后在此窗体里加载 一个title 控制,然后加载一个label控制,
       然后如果是静态菜单,我就加 menu控制,如果是动态菜单,我可以加list 控制,最后再加softkey,这样我一个完成的菜单完成了,首先刷一个windows,然后刷标题,
       再刷list或者menu,然后刷label,最后刷softkey。基于这样的思路,我们就可以组织各种大家所看到的界面了。对于这样的方式我最喜欢,灵活,也能自动化。

  c、我自己的方式,也就是在小单一lcd中采用的,虽然基于windows,但是我去掉很多控制键,只做了,menu,softkey,title,然后把这三个根据各种组合糅合在一起,
       组成了多种menu,这样,我再做资源的时候,就按照糅合的方式做,减少系统扩展代码,尽量提高开发效率;

  d、当然以前还陆续接触了很多种菜单,不过都大大同小异,很多也忘记了。

3、再回过头来分析你提供的代码,你发现了吗?其实你的代码就是我提及的message box控件,而在我小lcd中,就是menu sofkey title糅合中的一种。
     基于这样的分析,你的疑问,不仅仅是改资源这么简单,其实在这里,我只要添加一种糅合方式,或者说原有不要的糅合方式稍微改下。

4、针对你的代码,我问一个问题,基于pop界面,有没有做到可以一次退到最上层菜单,而不仅仅是上一层父菜单?

以上!

(217224402)

出0入239汤圆

发表于 2014-5-30 21:28:30 | 显示全部楼层
mikal 发表于 2014-5-30 11:27
首先肯一点,在对菜单的设计娴熟度上,你现在肯定比我强多了,其实我不做系统菜单起码有5年了,现在也仅 ...

看的出来,您对菜单界面的设计也是驾轻就熟。
您讲解的关于界面设计的二种方式,我也比较倾向于第二种,即欧美的windows式。正如您所说,在小资源的单色LCD上面,很多东西其实是不太适合的。
需要做适当取舍,手工编码方面我也基本是这个模式。而贴出的POPMSG框就是 MessageBox框的框架的实现。
对于最后的疑问,因为我的的所有界面组织方式都是基于屏幕的。即以单一屏幕显示的所有内容为人机交互的最小粒度。屏幕之间可以自由跳转。这里没有
采用传统windows概念中的父-子窗口的概念,而是采用活动(当前)/非活动界面  ---- 子屏幕(弹出界面) 两级概念。
我以为,在嵌入式里面,完全没有必要追求桌面UI的的层叠窗口/父子窗口这样的东西,不仅耗费资源,而且用处不大。
除却资源的制约因素,再者就是嵌入式系统的输入接口里面很少配备有鼠标,而没有鼠标,层叠窗口基本如同废物。
另外,嵌入式系统也很少同时需要运行多个窗口。
POP界面的与当前界面的交互关系:

POP界面弹出:
   1. 处理自己感兴趣的消息,其中如果有POP上面有按键,则按键消息必须处理,否则,处理定时器消息,用于一段时间后自动销毁本POP界面。
   2. 对于自己不感兴趣的消息,直接返回,消息由当前界面处理。
POP界面退出:
   退出时候,会发送POP界面退出消息到 当前界面。注意,POP发送的消息始终是被当前界面处理的。前面有讲到 整个系统界面处理
   采用活动(当前)/非活动界面  ---- 子屏幕(弹出界面) 两级概念。
   当前界面处理POP界面的退出消息。根据相应的消息标志,自行判断,然后做出处理。
   如对于您最后提出的一点疑问,如果POP退出时候不是返回当前界面。而是返回其它界面。则当前界面处理POP退出消息时候,按照需求
   切换到其它界面即可。当然这个切换过程会导致当前界面退出,然后其它界面成为当前界面。整个过程完成。所以POP退出的时候,最后返回的
   界面是任意的,是根据设计者自己定义的处理流程来进行跳转的。而非仅仅局限于当前界面。
(217223320)

出0入0汤圆

发表于 2014-5-30 21:46:32 | 显示全部楼层
迈克和红金龙;
                      虽然我看得懂你们在说啥,但是我个人以为你们最好还是把一些思想,用一个简易的DEMO+一个小图形描述出来,其实对很多人的作用更多;
                    为什么,因为你们所说的这些东西,真的是必须有一定功底的人才听得懂或听得明白,要不然,纯属对牛弹琴,不信我们随便逮一个名词:WINDOWS消息,你信不信有好多人根本不晓得这是个啥东东!
                    如果,你们两们只是互相之间见物猎喜或是互相探讨,哈哈,当我没说哦;

PS:最后想说的,红金龙同志,我想说的是,其实在小屏年代做一个工具,就是所谓的文本编辑器,我不认为有多大意义,那才多大点东西,就算手写,也不过三二天;真正有意义的是,把昆仑通态或威纶他们家的组态给简化到我们这个电子领域来,我觉得,真是个大杀器现在所谓的迪文在这种工具面前简直就是个笑话;!话说,这真是个大工程;
(217217035)

出0入239汤圆

发表于 2014-5-30 23:31:17 | 显示全部楼层
kinsno 发表于 2014-5-30 21:46
迈克和红金龙;
                      虽然我看得懂你们在说啥,但是我个人以为你们最好还是把一些思想, ...

bingo!
一直没回复你的消息,是想等着看看真正有几个人能完完整整理解我所想表达的意思。到底还是只有你一个人。
确实界面/人机交互/用户接口设计,涉及的东西非常之多,可以这样说,嵌入式系统里面所有重要的部分都会涉及到。而且每个部分都是息息相关,环环相扣。
我曾经写过人机交互的几篇帖子,就是想讲讲这些非常重要但是却不被重视的部分。
如:
用户接口设计一 设备驱动
http://www.amobbs.com/thread-5514755-1-1.html
用户接口设计二 轮询VS中断
http://www.amobbs.com/thread-5514873-1-1.html
用户接口设计三---- 队列
http://www.amobbs.com/thread-5515235-1-1.html
用户接口设计四----多任务系统中的优先级
http://www.amobbs.com/thread-5515419-1-1.html
这些都是很重要的一些概念和必须掌握的东西,不管设计的项目是否带有LCD。因为人机交互并不是仅仅限定在LCD。一颗LED也照样是接口。同样需要仔细设计人机接口。
可惜感兴趣的人不多,或许大家对这些形而上层的东西都不在乎,或许是不屑于。所以,没有写下去了。
人机交互展开来讲,其实可以写成一本很厚的书。因为会涉及的部分非常之多。包括很多人非常感兴趣的但一直不得要领的裸机程序构架等等。

所以这方面的东西其实是很复杂的一个东西。没有一个大而统的设计规范。所以才会不断的有人跳出来问说菜单如何写,界面如何设计,界面结构如何安排才合理。
反正每次项目要用到了,花个十几二十天折腾折腾也能捣腾出来,无非就是代码不好看,臃肿,到处COPY原来代码,改资源么。体力活罢了。

这个讨论里面我也有结合图片讲解,如25楼道发言。就是因为语言太空洞,上图了,才能表达的一清二楚。我其实也非常希望参与讨论的人贴图,这样可以直接对症下药。
有时候就是看见参与讨论的人多了,就不自禁的多讲几句。没人探讨,也就引不出这些了。

呵呵,迪文的商业上还是值得学习的。不过技术上实在是无力吐槽,都发展上十年了。写的上位机软件真的就只是一个玩具啊。这也是它难以被广大开发人员接受的重要原因。
设计上位机组态软件,资深的上位机软件工程师2~3人,外加其它工程师,没有一两年时间整出来的基本无法用。个人开发的话,难度和时间都是难以计算的.....
我目前正在着手做你说的简易版。帖子中给出的一些贴图就是从上面抠出来的。
平均下来一天还不到20行的有效代码量~~~




(217173632)

出0入0汤圆

 楼主| 发表于 2014-5-31 11:34:40 | 显示全部楼层
kinsno 发表于 2014-5-30 21:46
迈克和红金龙;
                      虽然我看得懂你们在说啥,但是我个人以为你们最好还是把一些思想, ...

呵呵,本来发帖是求高手说说用哪个架构好的。

但是具体架构怎么架,我也是一塌糊涂,到现在还没有看明白:

1、一个占用内存极少的菜单系统的实现,还有他的升级版;
2、还有傻孩子的架构;
3、还有本帖中辉哥和另个高手的思路。


其实讲思路的同时配上一个demo,那是最好不过的了。

我一般学习别人的菜单先大概看一下,然后移植到我的板子上跑,看现象,

然后仿真分析没一句话,直到完全弄明白且自己能使用为止。


我先贴一个别人写的菜单,弄明白后我在上面增加过东西,架构类似第二种:

菜单如下:








代码如下:
  1. void DisplayMenu(void)
  2. {
  3.    if((Key_Confirm)||(Key_Cancel))
  4.    {
  5.       F_EnWriteLCM = 1;
  6.    }
  7.    switch(MainMenu)
  8.    {
  9. //-----------------------------主菜单---------------------------        
  10.       case menu:        
  11.            //    1.老化功能设置
  12.            //    2.通道设置
  13.            //    3.系统时间设置
  14.            //    4. 历史记录
  15.            Display_MainMenu();
  16.            break;
  17. //-----------------------------老化功能设置---------------------------  
  18.       case menu1:
  19.            switch(SubMenu1)
  20.            {
  21.                case menu1:
  22.                     //1.1 测试时间设定
  23.                     //1.2 测试模式设定
  24.                                            //1.3 通道校准
  25.                      Display_Menu1();
  26.                      //F_EnDispComplete = 1;
  27.                      break;                        
  28. //-----------------------------老化时间设定---------------------------  
  29.                case menu1_1:            
  30.                     switch(SubMenu1_1)
  31.                     {
  32.                       case menu1_1:               
  33.                            //人工启停
  34.                            //定时测试
  35.                            //Display_menu1_1(Channel_Point);
  36.                            Display_menu1_1();
  37.                            break;   
  38. //-----------------------------人工启停---------------------------  
  39.                       case menu1_1_1:               
  40.                            //F_EnDispComplete = 0;
  41.                            //Aging_TimeSet=1;
  42.                            //AT24C64_Write_OneByte(8,1); //1:人工启停,2:定时停止
  43.                            Display_menu1_1_1(1);
  44.                            break;
  45. //-----------------------------定时停止老化---------------------------  
  46.                       case menu1_1_2:            
  47.                            //F_EnDispComplete = 0;
  48.                            //Aging_TimeSet=2;   
  49.                            //AT24C64_Write_OneByte(8,2); //1:人工启停,2:定时停止
  50.                            Display_menu1_1_2();
  51.                            break;
  52.                       case menu1_1_3:            
  53.                            Display_menu1_1_2_1();
  54.                            break;
  55.                       default:
  56.                            break;
  57.                     }
  58.                     break;
  59. //-----------------------------老化模式设定---------------------------
  60.                case menu1_2:            
  61.                     switch(SubMenu1_2)
  62.                     {
  63.                      case menu1_2:               
  64.                           //PC电源模式
  65.                           //服务器电源模式
  66.                           Display_menu1_2();
  67.                           break;  
  68. //-----------------------------PC电源模式---------------------------   
  69.                           case menu1_2_1:               
  70.                                //F_EnDispComplete = 0;
  71.                                //Aging_ModeSet=1;
  72.                                //AT24C64_Write_OneByte(15,1);//1:PC电源,2:服务器电源
  73.                  Display_menu1_2_1();
  74.                                break;
  75. //----------------------------服务器电源模式---------------------------                          
  76.                           case menu1_2_2:            
  77.                                //F_EnDispComplete = 0;
  78.                                //Aging_ModeSet=2;
  79.                                //AT24C64_Write_OneByte(15,2);//1:PC电源,2:服务器电源
  80.                  Display_menu1_2_2();
  81.                                break;
  82.                           default:
  83.                                break;
  84.                          }
  85.                          break;        
  86. //----------------------------通道校准---------------------------
  87.                     /*case menu1_3:            
  88.                          switch(SubMenu1_3)
  89.                          {
  90.                            case menu1_3:               
  91.                                 ////按STRAT:开始校准
  92.                                 //按STOP: 停止校准
  93.                                 Display_menu1_3();
  94.                                 break;   
  95. //----------------------------通道校验中---------------------------
  96.                            case menu1_3_1:               
  97.                                 //F_EnDispComplete = 0;
  98.                                 Display_menu1_3_1();
  99.                                 break;
  100. //----------------------------通道校验完成---------------------------
  101.                            case menu1_3_2:            
  102.                                 //F_EnDispComplete = 0;  
  103.                                 Display_menu1_3_2();
  104.                                 break;
  105.                            default:
  106.                                   break;
  107.                          }
  108.                          break;
  109.                          */            
  110.                     default:
  111.                           break;
  112.                  }
  113.                  break;
  114. //----------------------------五路通道设置---------------------------
  115.       case menu2:
  116.                  switch(SubMenu2)
  117.                  {
  118.                    case menu2:   
  119.                         //电压上下限设定
  120.                         //电流设定
  121.                         //System_State |= 0x08;        
  122.                         Display_menu2();
  123.                         break;
  124.                    case menu2_1:     //电压上下限设定
  125.                         Display_menu2_1();                        
  126.                         break;
  127.                    case menu2_2:     //电流设定
  128.                         Display_menu2_2();      
  129.                         break;   
  130.                    default:
  131.                            break;
  132.                   }
  133.                   break;
  134. //----------------------------系统时间设置-----------------------------
  135.       case menu3:        //系统时间设置
  136.                   //System_State |= 0x08;        
  137.                   Display_menu3();
  138.                   break;
  139. //----------------------------历史记录与查询-----------------------------
  140.       case menu4:            
  141.                  switch(SubMenu4)
  142.                  {
  143.                    case menu4:         
  144.                         Display_menu4();
  145.                         break;
  146.                    case menu4_1:   
  147.                     Stop_Mode=0;
  148.                         Display_menu4_1();                        
  149.                         break;
  150.                    case menu4_2:   
  151.                     Stop_Mode=1;
  152.                         Display_menu4_2();   
  153.                         //Display_menu4_1();   
  154.                         break;  
  155.                    case menu4_3:  
  156.                     Stop_Mode=2;
  157.                         Display_menu4_3();
  158.                         //Display_menu4_1();      
  159.                         break;
  160.                    case menu4_4:
  161.                     Stop_Mode=0;
  162.                         Display_menu4_4();
  163.                         //Display_menu4_1();     
  164.                         break;            
  165.                    default:
  166.                            break;
  167.                   }
  168.                   break;  
  169. //----------------------------待机画面-----------------------------
  170. /**********************************************************************************
  171.                               老化过程中,待机画面
  172. ;*            显示1:      通道    电压        电流                              **
  173. ;*            显示2:        1:   12.5V         20A                              **
  174. ;*            显示3:        2:    5.2V         25A                              **
  175. ;*            显示4:        3:   3.35V         20A                              **
  176. ;*            显示5:        4:  -12.5V         20A                              **
  177. ;*            显示6:        5:      5V         5A                               **
  178. ;*********************************************************************************/
  179.       case menu5:            
  180.                  switch(SubMenu5)
  181.                  {
  182.                    case menu5:         
  183.                         Display_menu5();
  184.                         break;            
  185.                    default:
  186.                            break;
  187.                  }
  188.                  break;   
  189.        default:
  190.               break;
  191.        }
  192.        Key_Start=0;
  193.        Key_Stop=0;
  194.        Key_Down=0;
  195.        Key_Up=0;
  196.        Key_Left=0;
  197.        Key_Right=0;
  198.        Key_Cancel=0;
  199.        Key_Confirm=0;
  200. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(217172715)

出0入0汤圆

 楼主| 发表于 2014-5-31 11:49:57 | 显示全部楼层
mcu_lover 发表于 2014-5-30 23:31
bingo!
一直没回复你的消息,是想等着看看真正有几个人能完完整整理解我所想表达的意思。到底还是只有你 ...

其实多数人都想好好讨论的

但是他们研究的没有你们二位深,不知道怎么说,也不知道说啥,就是脑袋里没有那个概念。


所以呢高手们有好的思路如果可以分享的话就分享出来,后面会有越来越多的人去研究他,最后明白人多了,讨论也就有了。


还是拿这个来说:一个占用内存极少的菜单系统的实现,作者分享了他的思路,写了架构的原理,使用方法,配了demo。

后面有人就优化了那个架构分享了出来,还有人优化了但没分享出来,还有人用到了实际的产品中。

(217159264)

出0入239汤圆

发表于 2014-5-31 15:34:08 | 显示全部楼层
本帖最后由 mcu_lover 于 2014-5-31 15:35 编辑
guxingganyue 发表于 2014-5-31 11:34
呵呵,本来发帖是求高手说说用哪个架构好的。

但是具体架构怎么架,我也是一塌糊涂,到现在还没有看明白 ...


你举得这个例子非常好。代表了典型的手工菜单设计。把手工菜单的缺点表现的淋漓尽致。
你这种方法是最传统最基本的方法。一个子菜单一个函数。比使用结构体方式(论坛里面讨论的最多的,如一个占内存极少的菜单系统的实现,以及它的变种) 还要低一层次。
使用结构体方式的好处在于可以简化在不同级别菜单项之间的导航,可以省略掉你这里的多层switch嵌套。另外一个方面就是如果添加删除,菜单项,只需要修改结构体资源即可。
其它菜单导航部分不用修改,然后提供一个触发函数,用于选择该次按单项 时候执行该触发函数。使用结构体的方式,优点仅此而已。我们看到,使用结构体的方式,可以简化
菜单项之间的导航,但对于真正的界面开发工作来说,菜单导航的实现只是万里长征的第一步。真正麻烦,繁琐的部分还在于菜单项触发之后的界面编写。也就是上面提到的菜单项
触发函数。
不管使用结构体方式也好,还是你的这种方式也好。最终所有的工作都会集中在那些触发函数的具体编写里面。而这些就是界面开发的繁琐之所在。而论坛里面大部分的人都只关注
前面菜单项导航的实现,而忽略最重要的后半部分。
所以,要真正让界面开发工作变得愉悦起来,而非一件痛苦单调繁琐的事情。首先就是要改变观念。

对自己说,我的界面是这样组成的,首先是菜单项导航界面。然后每一个最终菜单项对应的界面是怎么样的。即要以面向界面的思维来构建整个系统的人机接口。牢牢记住一点,菜单界面只是
整个系统界面中的一个,是一个导航至其它界面要经历过路径。仅此而已。
主菜单--第一级



子菜单菜单:第一级菜单的第一项对应




子菜单菜单:第一级菜单中的第二项:



好了,没了,菜单项界面就是这么简单。这样组织更直观。

对,整个菜单界面就只有这么多。这里最重要的一个观念的转变就是面向界面,不要把菜单和具体
的功能设置,或者其它界面揉和起来。否则整个界面就混乱了。
实现这个菜单界面的方式有很多种,如采用结构体的方式,总之,在这里,需要实现一种方法来完成
不同菜单项之间的导航。

菜单完成之后就是具体的界面设计了。注意,每一个界面中,对按键的行为的定义是不一样的。
这也是为什么我们要以面向界面的的思维思考问题的原因所在之一。
如时间设置界面:

在时间设置界面,每个按键的功能根据该界面的功能来定义。如上下键进行选择,确定键进入编辑状态等等。



历史记录查询界面



处理上下键以及确定取消键,确定键按下之后,进入具体信息查看界面:






老化时间设定界面
处理上下确定,取消键




老化模式设定界面




通道校准界面



通道上下限设置:




这样是不是整个结构非常清晰了,不管是后续维护,添加什么功能,都非常容易。
思维转换过来了,才能提高效率。希望大家以后都要以面向界面/屏幕的方式来思考人机交互程序设计。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(217158741)

出0入239汤圆

发表于 2014-5-31 15:42:51 | 显示全部楼层
希望这个简单的例子能够让大家看到为什么自动化的工具与手工菜单是天壤之别了。
不管是对于后续的维护,说明文档的管理,还是开发的便捷性都是手工永远无法比拟的。
你费时费力花了十天半个月甚至更长时间做出来的界面效果。也许换种方式,只要半天甚至半个小时。
(216919746)

出0入0汤圆

 楼主| 发表于 2014-6-3 10:06:06 | 显示全部楼层
mcu_lover 发表于 2014-5-31 15:34
你举得这个例子非常好。代表了典型的手工菜单设计。把手工菜单的缺点表现的淋漓尽致。
你这种方法是最传 ...

1、界面做的非常漂亮,理解能力超凡啊

2、这个菜单界面你用什么软件做的呢,还有就是那个画曲线的软件,界面非常的漂亮

3、你还是从思路的层面给出了你的机械化的设计方法,我还是不能理解,只是感觉很好很强大。能否把这个例子的demo分享出来供大家学习一下呢
(216919226)

出0入0汤圆

发表于 2014-6-3 10:14:46 | 显示全部楼层
mcu_lover 发表于 2014-5-31 15:34
你举得这个例子非常好。代表了典型的手工菜单设计。把手工菜单的缺点表现的淋漓尽致。
你这种方法是最传 ...

高手

界面好漂亮啊,这些是在虚拟机上实现的吗
(216919131)

出0入0汤圆

发表于 2014-6-3 10:16:21 | 显示全部楼层
mikal 发表于 2014-5-29 17:18
其实,你做到工具化,肯定值得我们去学习。但是,所谓手工,我们之间的认知可能不一样!

你给的链接,其 ...

ls,就想那个谁说的,有没有一个实际的例子或者视频

来阐述你的菜单思想呢

光文字描述很不好理解啊
(216919052)

出0入0汤圆

发表于 2014-6-3 10:17:40 | 显示全部楼层
kinsno 发表于 2014-5-30 21:46
迈克和红金龙;
                      虽然我看得懂你们在说啥,但是我个人以为你们最好还是把一些思想, ...

ls是个直人,很好
(216915751)

出0入0汤圆

发表于 2014-6-3 11:12:41 | 显示全部楼层
讨论到这里,发现此帖的讨论深度完全够了!我个人认为值得每一个人去认真体会!
@mcu_lover 很不错,图形,思路的结合非常棒!
@guxingganyue 也阐述了自己的一些想法。
@kinsno 你太绝了,组态啊,组态,那是一个恐怖的东西!

此论坛@还不支持啊?

其实,我有个缺点,就是不会画图,也不会上位机软件,所以,在工具这方面很薄弱,有时候我就只能做脚本,唉,伤心太平洋!

接下来,我就针对几位在ls提到的一些东西,分享一些我自己的文字看法。当然还是没有图形!也许会很空洞,呵呵!
(216913683)

出0入0汤圆

发表于 2014-6-3 11:47:09 | 显示全部楼层
mcu_lover 发表于 2014-5-30 21:28
看的出来,您对菜单界面的设计也是驾轻就熟。
您讲解的关于界面设计的二种方式,我也比较倾向于第二种, ...

到这里,我才真正明白你的菜单软件实现架构!任何时候就是2层,当前活动界面,弹出界面。
从这个思路逆向思考,我想问一下,你的自动化工具 比 你认为的手动菜单的 不同在哪里?

我举例提出如下问题:
1、别人的手动菜单不是2级概念,而是1级?那么1级比2级差在哪里?

2、你的2级自动化菜单是不是直接按照你的贴图所示,一级一级填入,最后可以编译成代码,直接或者少量改动就可以融合
     到你的系统中?

3、如果2成立,那么在自动化工具中,你菜单的位置是否可以随意变动,风格是否也可以改动?

4、自动化菜单编辑过程中,能实现和底层驱动接口函数直接对接吗?还是说生成代码后,自己手动改!

5、按照你的思路,每个菜单一个屏,那么每个屏是否都有对应的处理函数?
(216908614)

出0入0汤圆

发表于 2014-6-3 13:11:38 | 显示全部楼层
kinsno 发表于 2014-5-30 21:46
迈克和红金龙;
                      虽然我看得懂你们在说啥,但是我个人以为你们最好还是把一些思想, ...

我们直接入正题吧! 关于demo什么的,红金龙已经举例子了。那我想谈的就是组态。

组态是一个很好的东西,这个我们都不否认,可组态从理论上就有些天生的缺陷,所耗资源太大了,另外其对软件系统要求也有局限,
基本都限于wince,linux,安桌这些大的OS,对一个对硬件,软件资源要求如此多的产物,我们再绞尽脑汁把它简化到小型系统中来,
其就是本末倒置。君不闻,由俭入奢易,由奢入俭难!

我们再把眼光横向看看通信行业。看看颠覆世界通信终端格局的MTK和展讯〔全球多少方案提供商被他们打死〕!它们是怎么让客户在
简单ARM7 ,72M主频的手机设计中,换换UI,换换手机壳,而每年产生数千亿的GDP?当然,如果已经进入了安桌时代,技术的天平
是否又再一次倒向了国外。展讯是在threadx OS+windows menu(UI framework)给客户提供一个GUI 框架,让客户快捷的二次开发,
MTK是在 nucleus OS+windows menu(UI framework)给客户提供一个GUI 框架,让客户快捷的二次开发。这2家公司在给客户提供
便捷的UI二次开发都有一个前提,诚如现在的组态软件一样,一个确定的OS,只不过这个OS要简洁些,但消耗的资源依然很大,ram起
码在500k以上。

行文至此,一个大而全的mini 组态软件在嵌入系统中是否真的可行,我相信你有些明白了。其实我们在做产品的时候,都是在做权衡,
比如性价比权衡,审美观权衡,生产权衡,维修权衡等等。

所以,我在讨论产品或者技术的时候,我希望从思路上讨论,而不喜欢局限于实现的具体方式,合适才是最好的选择!
(216906191)

出0入0汤圆

 楼主| 发表于 2014-6-3 13:52:01 | 显示全部楼层
mikal 发表于 2014-6-3 11:47
到这里,我才真正明白你的菜单软件实现架构!任何时候就是2层,当前活动界面,弹出界面。
从这个思路逆向 ...

ls的专研精神值得学习。



(216905937)

出0入0汤圆

发表于 2014-6-3 13:56:15 | 显示全部楼层
mcu_lover 发表于 2014-5-31 15:42
希望这个简单的例子能够让大家看到为什么自动化的工具与手工菜单是天壤之别了。
不管是对于后续的维护,说 ...

这里我又要提几个问题!
1、你心目中的手工菜单,到底怎么定义的?(其实我一直很纠结你对手工菜单的鄙视) 。

2、在如上图示中的文字,我终于明白,你一再强调的菜单,原来指的是一个界面中的的菜单项。
     这里我解释下我口中 菜单,其实就是包含所有菜单项,标题 和 softkey,也就是你认为的屏。

3、按照你的图示,我想不明白,为什么你的菜单添加容易,而别人的手工菜单添加难?
     这里统一菜单的概念,就是你口中的屏!我口中的菜单。


我现在最担心的是,你把我原来一直说得菜单 按照你自己理解的菜单项来讨论手工菜单问题。
(216904447)

出0入0汤圆

发表于 2014-6-3 14:21:05 | 显示全部楼层
xtaens 发表于 2014-6-3 10:16
ls,就想那个谁说的,有没有一个实际的例子或者视频

来阐述你的菜单思想呢

没有啊,其实我不是专业做菜单的,我的都是手工菜单;
思路没有达到,我的架构很难去吸收消化!
(216902640)

出0入239汤圆

发表于 2014-6-3 14:51:12 | 显示全部楼层
本帖最后由 mcu_lover 于 2014-6-3 15:10 编辑
mikal 发表于 2014-6-3 11:47
到这里,我才真正明白你的菜单软件实现架构!任何时候就是2层,当前活动界面,弹出界面。
从这个思路逆向 ...


你应该是明白了我的界面构架。而非菜单构架。菜单在我这里已经只是属于一个部件。就像windows 上面的一个widget.
在单色液晶的应用场合下,分辨率和颜色深度都非常不适合做成overlap的界面出来。两层应用绰绰有余。所以我在手工编码设计的时候
设计成活动界面  + POP 界面 二级的形式(非两级菜单,这点千万不能混淆,上面提到,菜单在这里只相当于一个widget)
不同之处,在于开发的便捷。工具就是提升效率的哇。上面多次强调。可能你花十天半月编码调试出来的界面效果。我可能用工具只需要十个小时,甚至更短。
效率的提升,在于我们利用了windows桌面操作系统,才得以实现所见即所得的设计方法。类似于各种编程语言IDE提供的 DIALOG设计器。
因为嵌入式单色界面设计,其实范式是比较固定的。所以通过适当的抽象,最后得到一些公共的界面对象,最后就可以实现快速开发了。这个抽象过程本来就是
从大量的手工编码界面设计经验中提取出来的。所以,工具在这里是大大提升手工的效率,如虎添翼。不知这样表达您是否会更加清晰我所表达的意思。

下面回答您提出的若干疑问:
1. 上面提出了菜单是属于界面的一个widget,所以一级两级,N级都没有区别,它们都在同一个界面显示并与用户交互。55楼的图片应该是很清晰地显示出来这种关系了的。
    对于菜单,我用蓝色的连接箭头表示了。表示这些显示都是处于同一个界面,不需要在概念和显示上面分开。而菜单确认之后跳转进入的其它设置界面/功能界面,我用
    红色的连接箭头标示出来了。您可以回过头看55楼的图片,再联系这里的话揣摩一下。

2. 菜单是树形结构。所以在工具上放置一个菜单widget,然后配置其属性。属性的配置,就是按照树形层次结构输入各个ITEM 文字(对于条项形菜单)。对于带位图的,则还
    需要选择一副图片。
    这些界面元素(不仅仅是菜单),如55楼提及的时间设置界面。这与菜单是不相干的,它是独立的一个界面。它上面除了静态的文本框之外,还有几个编辑框用于输入时间值。
    最后在工具里被编译为资源的形式。然后此资源可以和代码手工编译。这是方式一(常用方式)。方式二是此资源直接下载烧录到MCU的FLASH或者外接的FLASH里面(组态软件方式)

3. 界面元素的位置,在工具上面设计好之后。在下位机运行时候是无法动态修改的。除非这个界面元素是本身就用作动态改变位置的场合。您可以举例一下。我好像很少见过液晶上面
    显示的东西的位置需要动态移动的。所以有点难以理解菜单动态移动是一个什么样的概念。风格也是指定之后就无法在下位机动态修改的。这些风格的抽象就是从各类手工菜单中提取
    出来的。为啥下位机要动态改变菜单的风格呢?这些东西不是在设计之初就应该在设计人员的头脑中构建好了的吗?

4. 界面工具生成的是一堆资源,需要有一个资源解析器。与底层没有任何的关联。抽象的层次高于具体的显示硬件。手工不用修改任何东西。

5. 不是每个菜单一个屏。本段回复文字以及前面多个回复中,我反复提到菜单只是界面的一个部分,菜单界面就是一个菜单界面。而非一个菜单对应一个界面,或者一级菜单对应一个界面。
    不管是N级菜单,它们都只属于一个菜单界面。在一个界面中显示,并处理所有的用户交互。
    我感觉大家可能一直都没有理解这点。因为从头到尾,几乎所有的人都讨论的是菜单设计,而忽略掉了界面设计。而我恰恰至始至终在强调界面如何设计。强调不能本末倒置,把菜单误以为
    是整个系统中唯一需要处理的东西。在55楼中,结合每一个界面,以及连接的指示图,我觉得大家应该能够理解的了。如果不理解。试图想象,如果你手工敲代码完成55楼中的人机交互界面,
    你的代码结构如何组织。
    以前我没有着手自动化设计的时候,也就是完全手工设计所有的界面时候。如您所说。每个独立的界面都是有一个独立的界面处理函数。因为每一个独立的界面,需要处理的东西不同,这种差异
    导致每一个界面需要独立的考虑到。如我有两个独立的设置界面A, 和B。 而同样一个按键,其功能在界面A 和 界面B 中可能代表的意义就不一样。这也是为什么每个独立界面需要一个独立的界面处理函数。

    下面是一个空界面的框架,其实就是一堆消息的处理:

所以,对应到具体的项目中,如果是手工编码的话,就需要为每一个界面,设计这样的界面处理函数。虽然我已经将人机交互设计抽象成了一个个的界面设计。站在这个抽象层次上,
设计界面已经很简单了,如每个界面都会有一些预定义的消息处理,和自定义的消息处理。如你有一个界面,每次从其它界面进入时候,需要执行一些动作,或者调用一些函数,则
在这里就是处理MSG_UI_ENTER_SCREEN 这个消息。所以,通过将尽可能多的通用的东西抽象出来为具体的消息,而消息的处理,则由每个具体的项目中实际情况来进行处理。可以说
手工界面设计,达到我上面的这样的地步,开发起来已经是非常便捷了。不过就是思考各个界面应该如何显示,如何处理,然后去处理对应的消息或者自定义消息即可。可能你会在草稿纸上
手工绘制各个界面的的样式,最后再转变为具体的消息处理的代码。但是对于我来说,我仍然觉得繁琐。我希望有一个工具,我就像画画一样,按照我想的界面方式,在电脑上面画出来之后。
我的界面设计工作就完成了。它们就可以在实际的液晶上面运行了。工程师应该是艺术家,是工匠,对吧,永远追求卓越,所以这就是我为什么即便手工编写界面已经抽象成如此方便,我还要
着手自动化的工具设计的原因所在。不知看到这里是否更清晰明白了。

PS:写这段文字的时候,没有看到您65的回复,所以上面提到的菜单与界面,仍然按照之前理解的。不过并不影响我要表达的意思。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(216901735)

出0入239汤圆

发表于 2014-6-3 15:06:17 | 显示全部楼层
本帖最后由 mcu_lover 于 2014-6-3 15:07 编辑
mikal 发表于 2014-6-3 13:56
这里我又要提几个问题!
1、你心目中的手工菜单,到底怎么定义的?(其实我一直很纠结你对手工菜单的鄙视 ...


呵呵,通过您说的这三点,终于了解到原来沟通确实存在一点问题。
最开始我以为您提及的仅仅是关于菜单项,而非所有(如各种界面元素,值输入项等等),后来我看到您提及的印度和欧美的方式,我开始觉得您说的界面方式与我所想的基本一致了。
直到现在,我才发现,其实讲的是同一个东西,而我们两个对它的定义略有出入。

不过这并不影响讨论,反而更好。因为您口中的菜单就是我一直在强调的界面。而界面并非仅仅包含菜单项的,还包含很多其它界面元素。这更好。为什么呢?因为手工编码这样的
菜单(界面)已经很复杂了。不信,您可以试试把我55楼的画出的时间设置界面,进行定义,并处理按键交互。

回答您最关心,也一直纠结的第三点:工具的设计来源于手工菜单的总结和抽象,所以在效率上面来的快的多的多。最简单例子,光一个文字的坐标,位置,大小,您需要一点点的调整吧。
                                                   用工具的话,就是用鼠标拖动调整位置,点击几下,就好像您在电脑桌面拖动图标那样^_^并可以马上看到调整后的效果。其它的解释见67楼后面一段文字。
(216891889)

出0入0汤圆

发表于 2014-6-3 17:50:23 | 显示全部楼层
mcu_lover 发表于 2014-6-3 15:06
呵呵,通过您说的这三点,终于了解到原来沟通确实存在一点问题。
最开始我以为您提及的仅仅是关于菜单项 ...

到这里为止,包括你67楼描述的,我已经完全明白了你的整体架构! 恭喜你,基于pc端的软件工具很好!值得我们去学习。

但我另外提出一点,你可以去思考,其他人,如果觉得难以思考,就考虑 红金龙的方案也可以。

关于菜单的说法我们已经统一了,那么我以后所说的菜单就是菜单而非菜单项!
鉴于每个菜单一个处理函数肯定比每个菜单项一个处理函数要好,但是,每个菜单一个处理函数也仅仅是入门偏中等思想。
离我在以上几个楼提出的思想还是有些差距。 我这里再重申下思路,把具有相似处理的菜单函数合并一个处理函数,把
不同的处理再单独拿出来!


比如,如图示例,可以把10个菜单处理函数简单划分成6个,
分别为:
处理函数1
处理函数2
处理函数3
处理函数4
处理函数5
处理函数6
然后我们再仔细分析下,如果处理函数3不具备编辑功能,就把处理函数3合并到处理函数1即可,这样,10个菜单处理函数减为5个,
依此思路,合并一些具备相似功能的菜单函数,形成我之前说的所谓default处理函数,然后就形成了我说的控件!然后再返回一个
高深的话题,组态软件,其实控件就是组态软件的核心。

然后再回过头来说说,我这样的手工菜单,你觉调试很困难吗?当然,里面的类似控件编程技巧要有的,比如每个菜单项,左靠齐,
菜单项列表用数字还是图标,菜单标题居中还是左靠齐,是否填充显示,还是滚动显示,菜单项内容超出了屏宽是否启动滚动显示等等
这些特效全部做到了default 控件中去了,我的手动也就是添加菜单项汉字而已,或者加入图标。

当然,针对tft lcd 我也有自己一个套arm7 内核模拟器,有160*128  16色的tft,全屏触摸,16键的。把自己做的界面代码编译后,直接
上arm7模拟器直接显示,看效果。

ok,关于菜单的问题就讨论到这里,希望大家共勉!




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(216891152)

出20入65汤圆

发表于 2014-6-3 18:02:40 | 显示全部楼层
mikal 发表于 2014-6-3 17:50
到这里为止,包括你67楼描述的,我已经完全明白了你的整体架构! 恭喜你,基于pc端的软件工具很好!值得 ...

像是层次状态机的做法
(216838956)

出0入0汤圆

发表于 2014-6-4 08:32:36 来自手机 | 显示全部楼层
这么好的东西,学习一下
(216838493)

出0入0汤圆

发表于 2014-6-4 08:40:19 | 显示全部楼层
mikal 发表于 2014-5-29 17:18
其实,你做到工具化,肯定值得我们去学习。但是,所谓手工,我们之间的认知可能不一样!

你给的链接,其 ...

stMenuConf   此结构体如何定义?
(216836703)

出0入0汤圆

 楼主| 发表于 2014-6-4 09:10:09 | 显示全部楼层
ljt80158015 发表于 2014-6-4 08:40
stMenuConf   此结构体如何定义?

此结构估计不开源的哦
(216828586)

出0入0汤圆

发表于 2014-6-4 11:25:26 | 显示全部楼层
ljt80158015 发表于 2014-6-4 08:40
stMenuConf   此结构体如何定义?

你难道没有仔细看?
(216828530)

出0入0汤圆

发表于 2014-6-4 11:26:22 | 显示全部楼层
guxingganyue 发表于 2014-6-4 09:10
此结构估计不开源的哦

那么大的代码放在那里,还有中文解释!这不叫开源,那什么才叫开源啊!
(216819929)

出0入0汤圆

 楼主| 发表于 2014-6-4 13:49:43 | 显示全部楼层
mikal 发表于 2014-6-4 11:26
那么大的代码放在那里,还有中文解释!这不叫开源,那什么才叫开源啊! ...

1、不好意思记错了,我以为是mcu_lover的那个呢

2、我刚才又看了一下,确实没有找到你的这个类的定义的地方啊???(我在本页面搜了一下,只找到4个位置出现过那个词,确实没有发现是怎么定义的)
(216746325)

出0入0汤圆

发表于 2014-6-5 10:16:27 | 显示全部楼层
guxingganyue 发表于 2014-6-4 13:49
1、不好意思记错了,我以为是mcu_lover的那个呢

2、我刚才又看了一下,确实没有找到你的这个类的定义的 ...

23楼!
所以说,还是不仔细看。
已经描述的了,难道非要把结构体原型代码贴出来才算是源码啊。中文描述,使用定义都有了,应该算开源了吧。
自己组织下就好了呗。
(216738271)

出0入0汤圆

 楼主| 发表于 2014-6-5 12:30:41 | 显示全部楼层
mikal 发表于 2014-6-5 10:16
23楼!
所以说,还是不仔细看。
已经描述的了,难道非要把结构体原型代码贴出来才算是源码啊。中文描述 ...

理解错误了。
(216665176)

出0入0汤圆

发表于 2014-6-6 08:48:56 | 显示全部楼层
http://www.amobbs.com/thread-5577786-1-1.html
大家讨论下LED的菜单框架看。。。。。。。
(216665142)

出0入0汤圆

发表于 2014-6-6 08:49:30 | 显示全部楼层
看有没有更好的方法
(214490114)

出0入0汤圆

发表于 2014-7-1 12:59:58 | 显示全部楼层
guxingganyue 发表于 2014-5-27 18:23
哇,这么好。对windows menu 没有接触过,xp下的菜单都挺好的

研究这个主要是在12864点阵下做个简单的界 ...

能否加QQ聊聊,向你请教下菜单该如何做,不在乎是否繁琐,只要能做出来就可以了,以后做多了再来研究好的方法,qq2300950641
(211943744)

出0入0汤圆

发表于 2014-7-31 00:19:28 | 显示全部楼层
我要mark一下!
(211943723)

出0入0汤圆

发表于 2014-7-31 00:19:49 | 显示全部楼层
我要mark一下!
(210736127)

出0入0汤圆

发表于 2014-8-13 23:46:25 | 显示全部楼层
MARK一下         
(209402441)

出0入0汤圆

发表于 2014-8-29 10:14:31 | 显示全部楼层
mcu_lover 发表于 2014-6-3 15:06
呵呵,通过您说的这三点,终于了解到原来沟通确实存在一点问题。
最开始我以为您提及的仅仅是关于菜单项 ...

兄弟,请问你的界面自动化用的什么软件,感觉很可以啊
(207023247)

出0入0汤圆

发表于 2014-9-25 23:07:45 | 显示全部楼层
希望两位能继续讨论下,我们需要学习更多的。

比如消息传递,是靠什么传递呢?  定时判断状态机?  界面能画出来,CPU 不可能就一直做一件事情吧? 同时处理别的事情时候怎么处理呢?

可能问题有点简单,目的就是希望两位能再讨论讨论,呵呵!
(205952679)

出0入0汤圆

发表于 2014-10-8 08:30:33 | 显示全部楼层
学习,记号一下。
(205947492)

出0入0汤圆

发表于 2014-10-8 09:57:00 | 显示全部楼层
我用的傻孩子的菜单架构,加上了边上进度条显示,也方便修改,还是手工做菜单,加减都很方便


字体是12*12的,能多显示一个状态栏


滚动条也方便修改,一个是菜单项数,一个是当前选项,随当前选项翻页滚动

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(205947089)

出0入0汤圆

发表于 2014-10-8 10:03:43 | 显示全部楼层
mark一下,这个帖子很经典
(205946924)

出0入0汤圆

发表于 2014-10-8 10:06:28 | 显示全部楼层
上下选择或直接数字键选择都可以,还是比较方便使用的,就是做菜单时要先考虑下菜单效果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(205946855)

出0入0汤圆

发表于 2014-10-8 10:07:37 | 显示全部楼层
非常好的帖子,值得学习
(205939013)

出0入0汤圆

发表于 2014-10-8 12:18:19 | 显示全部楼层
菜单架构mark 等回头过来看
(205935349)

出0入0汤圆

 楼主| 发表于 2014-10-8 13:19:23 | 显示全部楼层

我来附上傻孩子菜单的链接:

http://www.amobbs.com/forum.php? ... 4%BA%A4%E6%B5%81%5D
(205323192)

出0入4汤圆

发表于 2014-10-15 15:22:00 | 显示全部楼层
不错,学习下
(203055036)

出0入0汤圆

发表于 2014-11-10 21:24:36 | 显示全部楼层
学习了,受益匪浅。感谢参与讨论的。
(202128281)

出0入0汤圆

发表于 2014-11-21 14:50:31 | 显示全部楼层
我想请教下给位,我在设计界面时,用到4个按键,这4个按键控制菜单导航是没有问题的,但是如何用这四个按键来设置子菜单里面的:设定值啊,比如说设置高点是25,低点是0,请问这4个按键如何在菜单导航和子菜单设定值的设定之间复用啊
(201336446)

出0入0汤圆

发表于 2014-11-30 18:47:46 | 显示全部楼层
今天终于通过这个帖子明白“红金龙吸味”的思路了,半年啦,现在已经做完了,当时看的我是抓狂啊。我是用的结构体,菜单只是GUI的一个控件而已,标题栏、滚动条也做成控件了
(199942358)

出0入0汤圆

发表于 2014-12-16 22:02:34 来自手机 | 显示全部楼层
zhenghe 发表于 2014-11-30 18:47
今天终于通过这个帖子明白“红金龙吸味”的思路了,半年啦,现在已经做完了,当时看的我是抓狂啊。我是用的 ...

详细介绍一下咧!
(197950805)

出0入0汤圆

发表于 2015-1-8 23:15:07 | 显示全部楼层
zhenghe 发表于 2014-11-30 18:47
今天终于通过这个帖子明白“红金龙吸味”的思路了,半年啦,现在已经做完了,当时看的我是抓狂啊。我是用的 ...

听起来不错的样子。。。
(197820587)

出0入0汤圆

发表于 2015-1-10 11:25:25 | 显示全部楼层
为什么感觉楼主做的东西是温湿度报警控制器啊,楼主不会在青岛吧。???
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2021-4-18 01:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表