首页 理论教育用户界面事件模式优化技巧

用户界面事件模式优化技巧

【摘要】:LabVIEW支持用户界面事件和通过编程生成的事件,但不支持外部I/O事件。用户界面事件模式一般由While循环和事件结构组成,程序开始后进入等待状态,等待某个事件发生后进入相应处理代码,处理结束后回到等待状态。图5-21 画板前面板由于系统需要响应鼠标在画布上单击、移动和释放事件,因此使用状态机模式是无法解决的,只能通过事件结构。因此本例将使用用户界面事件模式实现上述的画图板功能。

针对基本状态机模式的第4)~5)个问题,需要对模式进行改进。通过搜索的方式来捕捉所有的“单击按钮”事件或其他事件,往往会占用大量的CPU资源。另外,状态机模式并不能捕捉其他一些常见的事件,如鼠标移动、关闭窗口和单击某个菜单项等。为了解决这些问题,程序员可以使用用户界面事件模式。这种交互方式能够处理目前使用到的绝大部分事件,这是LabVIEW中用于人机交互的一种强大而高效的模式,而且事件捕获的方式采用中断实现,在事件没有发生期间,CPU可以处理其他的操作,这就极大地减轻了CPU的负担。

根据来源的不同,事件可以分为用户界面事件、外部I/O事件和其他程序事件。其中,用户界面事件包括鼠标单击、键盘按键等动作;外部I/O事件包括当数据采集完毕或发生错误时硬件定时器触发器发出信号等情况;其他程序事件可通过编程生成并与程序的不同部分通信。LabVIEW支持用户界面事件和通过编程生成的事件,但不支持外部I/O事件。

用户界面事件模式一般由While循环和事件结构组成,程序开始后进入等待状态,等待某个事件发生后进入相应处理代码,处理结束后回到等待状态。这种程序模式的执行顺序取决于具体发生的事件及事件发生的顺序。

【例5-4】统计循环次数和按下按钮次数

本例采用用户界面事件模式统计循环次数和按下按钮次数,程序前面板如图5-18所示,程序框图分别如图5-19、5-20所示。

978-7-111-49442-3-Chapter05-20.jpg

图5-18 程序前面板

978-7-111-49442-3-Chapter05-21.jpg

图5-19 统计“确定”按钮次数的事件分支程序框图

978-7-111-49442-3-Chapter05-22.jpg

图5-20 统计“停止”按钮次数的事件分支程序框图

【例5-5】画板应用

本例要模拟一个简单的画图板功能。它有4个功能选项:点(point)、线(line)、圆(circle)和椭圆(oval),一次完整的绘画过程是:在画布上单击鼠标开始绘制→按住鼠标的同时在画布上拖动鼠标→在画布上放开鼠标结束绘制。

程序的前面板如图5-21所示,由上下两大部分组成。上面用于选择需要画图的样式,下面是画布,右上方的“×”表示程序结束。

978-7-111-49442-3-Chapter05-23.jpg

图5-21 画板前面板

由于系统需要响应鼠标在画布上单击、移动和释放事件,因此使用状态机模式是无法解决的,只能通过事件结构。因此本例将使用用户界面事件模式实现上述的画图板功能。

程序框图如图5-22所示,共有4个事件,分别如下:

1)前面板关闭:响应前面板的关闭动作,这是一个过滤性事件,当事件发生时并不真正关闭前面板而只是停止程序的运行。

2)Picture鼠标按下:表示绘画开始。

3)Picture鼠标移动:表示绘画的路径和轨迹。

4)Picture鼠标释放;鼠标离开:表示绘画结束,此时一定要加入鼠标离开事件,因为当鼠标移动到画布的外面时就可以认为是绘画结束了,并不需要一定要求鼠标在画布中释放。

978-7-111-49442-3-Chapter05-24.jpg

图5-22 画板程序框图

Picture鼠标按下事件如图5-23所示,这个步骤表示绘制开始,每次绘制都必须从这个步骤开始。事件分支左侧的Button参数表示单击鼠标的键位,只有在单击鼠标左键时才被认为是合理的和有效的,当单击其他的键位时并不开始绘制。在有效绘制中,需要将画笔移动到鼠标当前单击的位置。当选择的画图模式是Line和Point时,使用Draw point.vi函数可以在当前的位置上画一个点并且将画笔移动到当前位置。

978-7-111-49442-3-Chapter05-25.jpg

图5-23 Picture鼠标按下事件程序框图

从图中可以看出系统定义了4个移位寄存器变量以实现不同事件分支的共享,它们的含义如下:

1)表示当前画布中的图像,事实上就是前面板picture中的内容。因为每次画图时都是在当前画布上图像进行叠加,所以需要使用移位寄存器以避免过多的局域变量。

2)表示开始绘制时的鼠标位置,也就是Mouse Down在画布上的相对位置,绘制的起点。

3)表示是否开始了绘制。前面提过每次的绘制过程都是从MouseDown开始的,如果没有这个动作,那么在鼠标在画布上的移动是无效的。

4)表示开始绘制时的图像,这个变量与变量1是不一样的。它表示在MouseDown时画布上的图像,而不是画布中的实时图像。

Picture鼠标按下事件如图5-23所示,该事件是在绘图的过程中,因此移位寄存器3的值必须是true。可以根据不同的画图类型使用相应的函数进行绘图,如画Line时,只需要把当前鼠标的位置作为Line的终点。Picture鼠标移动事件程序框图如图5-24所示。

978-7-111-49442-3-Chapter05-26.jpg

图5-24 Picture鼠标移动事件程序框图

Picture鼠标释放;鼠标离开事件如图5-25所示,该事件表示绘制的结束,因此只需要把移位寄存器3的值设置为false即可。

978-7-111-49442-3-Chapter05-27.jpg

图5-25 Picture鼠标释放;鼠标离开事件

本例的实现过程并不复杂,但是涉及了4个移位寄存器变量。一旦变量共享的数据较多时往往需要使用大量的移位寄存器,因此建议使用簇的形式将各个变量有序地组织起来。