CPB有三种版本:标准版、专业版和企业版。对于我们将要讨论的接口而言,标准版已经足够。
按钮、滑动块、标签和其它UI元素均可通过drag-and-drop环境插入一个表格(一个简单的对话窗口)中去。产生一个这样的表格就会生成一个C++类的框架。例如,每当用户点击一个图像或移动一个滑动块时,都会产生一组事件,而该表格中的每个元素都有这样一组事件与其对应。究竟需要对哪些事件作出反映则由程序员来选择。这些响应就被写成该表格所产生的类的成员函数。
如果前面板是由一个工业设计小组设计的,那么就会有整个显示图像可供利用。或者如果物理原型已经存在,那么一幅该物理原型的数字相片就可以用来作为背景。
我采用图像目标(在CPB内也叫作Timage)来显示大多数物理元件。因为采用了图像目标就可以引入位图,然后进行显示。例如可以引入一个发光二极管的图像。在该应用中,显示了一个包含5个按钮和4个LED的接口原图,如图1所示。背景图像中LED处于关断状态。一旦软件决定其中的一个LED应打开,那么这个发光LED图像的可见属性就被设为真,于是点亮的LED的图像就覆盖了不亮的LED图像。
有了这种简单的重叠多幅图像的诀窍,我们就可以仿真一个物理显示屏的其它部分。例如,假设我们采用CPB IDE来创建一个包含单词“ALARM”的标注,并将这一元素命名为AlarmIndicator,那么我们就可以编写一个函数来控制它:
void setAlarmState(Boolean state)
{
PanelForm->AlarmIndicator->Visible = state;
}
面板表格中包含了我们仿真时所用到的所有图形对象。Alarm-Indicator就是我们将一个标签放到面板表格上之后为其分配的名字。当我们将该标签通过拖拽到表格窗口中的方式加入该表格时,它就成为了该表格的一个数据成员。
在CPB中,显示屏上的一个元素的所有属性都可以作为表征该元素的类的公共数据成员。因此,Visible属性只需进行一个简单的分配操作就能改变。公共数据成员可以在程序中的任何地方通过分配而改变。在CPB中,各属性也有其特殊状态,允许在IDE中通过该状态改变属性。开发者可以点击一个标注,并在属性窗口设置Visible属性。显示的颜色和字体也可以通过类似的方法改变。
现在来看一个setAlarmState()程序,该程序用于驱动基于CPB的仿真。以下代码为CPB专用代码,在最终的目标上无法运行。不用多久,我们将不得不为目标接口编写该函数的另一个版本,形式如下:
void setAlarmState(Boolean state)
{
if (state)
{
ledRegister |= 0x02;
}
else
{
ledRegister &= ~0x02;
}
}
有时,编程的风格会导致一些小函数造成函数调用开销。在较小的系统中这一问题较受关注,而这些函数中有一些可以写成宏或者内联(inline)函数。我通常只在项目的最后阶段才开始进行这类优化。
|