软键盘产品界面显示的通用程序设计
int h; //控件高度,大小等于Controls[X][5]
int idvalue; //控件的id值,大小等于Controls[X][6]
struct pdacontrolslist *next; //指向下一条记录
};
(3)显示状态链
系统各种状态之间的转换用显示状态链(static int ShowStateList[22][11])进行控制。它是一个动态结构的双向链表,在应用程序初始化阶段,遍历pda_init.h文件中定义的状态转换顺序静态数组,动态生成该状态链。这种数据结构为电话簿和记事本的添加和修改操作提供了方便。由于电话簿和记事本的操作状态转换是单向的,所以采用双向链表结构实现线性状态的前后续状态转换。
Static int ShowStateList[22][11]数组的具体定义格式如下:
Y=0 Y=1 Y=2 Y=3 Y=4 Y=11 ShowStateList[X][Y] 状态1 状态2 状态3 状态4 状态5 … 状态11 ShowStateList[10][11] 38 39 40 0 NULL … NULL其中“状态1,2,3……”依次表示当前状态链的不同状态。“0”是结束标志,“NULL”表示没有数据。
在程序初始化的过程中,由这个静态数组生成一个双向链表数组OperationStates[22]。双向链表的每个节点数据域是一个整型常量。它的值等于与其相对应的状态控件链数组(PDAStateControlsList[53])的下标值。例如,如果节点的数据域为12,则对应PDAStateControlsList[12]状态控件链。具体的生成格式如图5所示。
(4)显示状态栈
显示状态栈存放的数据是显示状态编号。具体数据是从初始状态到达当前状态所经过的所有状态,栈数据处理由int StateStackPop()、intStateStackGet()、void StateStackPush(int a)三个函数实现。具体处理情况如图6所示。
1.2 编程实现
有了以上一套数据结构之后,具体编写程序代码时,根据不同功能所要完成的任务和使用的数据结构,可归类待编写模块,从而提供代码复用率。如电话簿和记事本就可以共用同一套程序代码。因此,关于PDA的所有系统模块划分如图7所示。
系统各个模块间的连接用状态栈以及一些公共变量实现,根据状态栈的信息确定工作到了哪个状态,根据公共变量获得完成操作所需要的信息。程序每进入一个新模块调用的通用处理函数,先屏蔽主界面上固定键盘内的所有按钮,再显示本界面的按钮,最后将固定按钮连接到进入模块的处理函数中,实现固定键盘操作含义的转变。
3 小结