荣小菜补钙记第
36期:labview菜单没图标、字太小还不好看怎么办?那就用簇做一个吧!
同步更新于 WeChat:荣小菜在补钙
大家好,我是荣小菜,也可以叫我Richie,最近暂时不讲AF系列,打算先讲讲使用LabVIEW时如何做一个漂亮的菜单。
1. 简介
最近遇到的一个问题。有客户说程序菜单字太小,能不能搞大一点。但其实根本原因还是LabVIEW提供的自定义菜单功能太简单。就像下面这样,顶多再加上一些快捷键之类的。依旧是比较单调的。
2. 使用簇控件DIY菜单
功能不够,脑洞来凑,其实菜单看起来就是鼠标移动到某处,就近整齐的弹出一堆其它可选项。而带有图案、颜色,字体可调节之类的功能,LabVIEW中普通的控件就完全能够满足。
那么,将一堆漂亮的控件放在一起(用簇规划),首个控件为逻辑触发控件,当鼠标移动进来,簇中其它控件显示、鼠标移动出去,控件隐藏,就可以模拟出菜单的效果了。该逻辑使用属性节点可以很容易做出来。
如下图所示,利用属性节点获取全部控件引用,之后就可以随意调整全部控件的“Visible”属性啦。
但是,考虑到去耦合可复用性,我们不能将一堆UI逻辑代码放在MainVi中,那样每次使用都要复制粘贴修修改改,很不方便。此外,若在多个项目中使用可能还会导致版本混乱。
因此,我们必须将整套逻辑封装,做成工具包,方便其它开发者使用。最终效果如下,开发者只需要3个函数即可完成菜单逻辑代码的复用。最初的输入是簇数组,其它必要的功能封装成了属性(如Read MenuItem获得当前选中的菜单项名称)。
需要注意的是,属性“Set Menu Init State“是用来调试用的,设置为T可以让控件全部显示出来,方便你查看和修改各个控件。正式使用时我们设置为F或不设置。
最终效果如下所示,各个簇控件放在一起组成了菜单,单击不同控件可获取对应标签。
3. Cluster Menu Core
我们代码目标是将运行逻辑封装成Vi,这样只需要输入簇引用就可以后台运行相关逻辑。代码的核心就是“Cluster Menu Core.vi”。上面讲的最终使用的3个Vi “Init”、“Run”、“Clear”的根本任务都是为了让“Cluster Menu Core.vi”顺利运行和停止。因此我们先从“Menu Core .vi“开始讲起。
首先,”Menu Core“需要利用注册事件(见Part1),这很关键,使得和控件相关的事件可以在子Vi中使用。
同时,”Menu Core“在进入While之前还需要队其控件进行一个简单初始化,功能是让首控件显示,其它控件隐藏。
注意:Part2中我们使用的数值引用来传递Visible所需的数据,作用是保证该值能够实时被修改,但是由于该值一般只在初始化阶段起作用,这里其实也可以不用。
Menu Core进While前初始设置
下面看Part3,当Cluster中某个控件按下时,我们要能判断哪个控件被按下了,这样后买你才能输出对应控件的标签名。要知道,我们使用的簇中各控件都是bool控件,是非严格的,因此新值是变体。直接从变体中判断哪个控件被按下可能还不太方便。这里我们使用 “变体至平化字符串”将变体转为字符串,控件数量不同字符串长度不同,而当有控件按下时字符串对应字节会变为01,利用这一规律,我们将其转换为U8数组,找到变为1的那个索引就找到了第几个控件被按下。
再看Part4,找到了被按下的控件,我们直接传递其标签名至“Selected MenuItem Queue”队列,这是一个专门用来存放被选中控件标签名的队列,其大小为1,后续只需要读取该队列即可知道被按下控件的名字。
需要注意的是,Part4这里我们使用了“转换为特定类”来判断被按下的是不是簇,主要是用来应对多级菜单的情况。这里埋个伏笔哈,下一期再将其作用。
Cluster Item值改变代码
之后,我们看Cluster鼠标进入事件对应的逻辑,很简单,就是设置其它控件可见。对应的鼠标离开就是设置其它控件不可见。代码如下:
鼠标进入事件代码
最后,我们利用属性定义文件,建立Read MenuItem .vi,代码如下,很简单,就是读取队列。不过这里需要一个超时,超时来自数值引用,数值引用的作用可以让我们的超时实时可变,方便我们顺利Read MenuItem。
Read MenuItem Tree
Read MenuItem后面板
当然,Read MenuItem timeout也是需要能实时设置的,我们还是利用属性定义文件,代码实现如下。
Set Time Out Tree
Set Time Out
哦对了,”Menu Core”要能够自己停止,因此需要用个用户事件“Stop”,很简单就不说了。
这样,Menu Core及其SupportVi就介绍完了(除了那个伏笔哈)。后面就看我们怎么使用它了。
4. 顶层Vi:Init与Clear
写完了Menu Core,我们在顶层需要写的配套Vi "Init"和"Clear"就很明确的了,代码如下,就是将所有需要的队列、用户事件和数值引用等初始化一下。没啥难点,就不多讲了。
Init后面板
Clear后面板
5. 总结
本期我们首先介绍了功能实现的核心Menu Core和其它Suppot Vi,之后简单讲解了Top层的Init和Clear Vi,后面就是如何使用了(主要在Run Vi),相关内容我会在下一期继续分享。
欢迎大家多多分享,共同进步^_^