基于CDMA手机地址簿开发设计
本应用程序中主要由控制架构模块,DB模块,UI模块及其外部扩展模块。其中UI模块总的来看包括查找子模块,详细表示功能子模块,添加功能子模块,
修改功能子模块,删除功能子模块。
5.1 控制功能子模块
通过ApiPage.h和Page.c作为公共的基类,所有的页面都将定义一个Page的实例,把各个页面的相应绘制函数,时间处理函数,释放函数的指针登记到Page实例的中相应的位置。在调用时,就实现了多态。使得各个页面各不相关.。
从而达到控制其他页面的功能。注意:程序从AddressBook.c进入主页面page1,然后再通过ApiPage.h和Page.c来调用其他所有的页面。
在这个模块中有一个结构体AddressBook
结构体定义如下:
typedef struct _AddressBook {
AEEApplet a ;
;
ST_UISTATEMGR *m_pstUIStateMgr;
} AddressBook;
其中的结构体ST_UISTATEMGR定义如下:
typedef struct _ST_UISTATEMGR
{
IShell *m_pIShell;
File m_File;
#ifdef __DEBUG
IBitmap *m_pIBitmap;
*m_bufferControl[3];
#endif
}ST_UISTATEMGR;
在上面的结构体中包含了两个重要的结构体变量:结构体m_File,用来进行DB处理,结构体*m_pstPageStack[ VP_PAGESTACK_SIZE ]用来记录打开的页面,便于显示各页面,记录光标位置。
控制模块的主要函数列表:
No. |
函数名称 |
函数处理及说明 |
1 |
AEECLsCreateInstance |
启动应用程序(函数入口) |
2 |
AddressBook_InitAppData |
初始化应用程序数据 |
3 |
AddressBook_FreeAppData |
释放资源空间,退出整个程序 |
4 |
ApiPage_Draw |
用来调用各个页面的draw函数 |
5 |
ApiPage_Release |
释放资源页面资源 |
5.2 DB模块
DB模块是AddressBook应用程序中最重要的部分。此部分的设计会直接影响到整个应用程序其他部分的实现与设计。一般而言手机中的AddressBook所容纳的记录条数不是很多,大多数都在300条左右,在此次设计中我们就将记录数设置为最多300条,整个AddressBook的记录信息一般不会很大,相对于手机中的几十兆甚至几百兆的存储空间来说是微不足道的。所以本应用程序的DB模块设计成数据库文件的大小是固定的,不随数据的的多少而变化。
本应用程序的DB模块是通过BREW平台下的文件接口实现的。DB模块是一个文件,这个文件分为两部分:标志区和数据区,标志区记录了相应数据区的数据是否有效,1表示有效,0表示无效,此数据文件具体结构如下;
若图片无法显示请联系QQ752018766
1、通过IFileMgr接口实现文件的创建,删除和出错处理。
2、文件读写操作。
IFILE_Seek ( ) 将文件操作位置定位
IFILE_Read ( ) 从打开的文件中读取指定数量的字节
IFILE_Write ( ) 将指定数量的字节写入打开的文件
3、索引操作
struct Index
{
AECHAR Name[NAME_LEN];
Int position;
}
在程序启动时把所有记录的Index创建起来以便索引。
Index是动态分配空间。
Index排序用指针排序,提高速度,降低开销。
4、姓名查找和快速查找都使用二分查找,提高速度,没有完全匹配的条目时则返回最相近的条目。
5、添加时,从标志区找到标志位是0的,将新纪录添加到该标志位对应的位置。
6、删除时将条目相应的标志位置0。
7、编辑时先将该条记录读出来,然后保存编辑后的内容。
此模块中主要的函数列表:
NO |
函数名称 |
函数处理及说明 |
1 |
CreateFile |
判断文件是否存在,若存在则打开此文件,若不存在则创建并打开文件 |
2 |
ReadFile |
从文件缓存中读取所有的记录 |
3 |
AddRecord |
向文件中添加记录 |
4 |
EditRecord |
修改记录并读取修改后的信息 |
5 |
SaveRecord |
修改或添加之后保存 |
6 |
DeleteRecord |
从文件中删除一条记录 |
7 |
DeleteAll |
删除文件所有的记录 |
8 |
FileRelease |
释放文件指针 |
9 |
FastSearch |
快速查找 |
5.3 UI模块
此模块中不仅要显示UI界面,而且有些模块还需调用DB模块中的接口函数。如:查找子模块,添加功能子模块,修改功能子模块。对应用到的DB中的接口函数在上节中都有介绍,这里不做介绍。
下面就我负责的描绘部分(page1和page2)做简单的介绍
首先对于在这次设计中的描绘,回调是重点,我用了回调机制来画菜单。
回调在BREW中是一个很重要的机制。用它使某些操作变得方便简单。
如画菜单的时候,用回调可以对菜单进行详细设定,例如:标题的高度,宽度,菜单项的高度,宽度等,而这些在BREW中的IMENUCTL接口中是固定不能设置的。
其次在page2快速查找页面中,不仅要求将文件中的记录全部显示出来,而且要做到快速查找的效果,即输入文本框中要找的记录的名字的一部分,光标会落在相应的记录上。后者前面已经介绍过,所以这里着重要讲的是前者即:如何把所有的记录全部显示出来。
NO |
函数名称 |
函数处理及说明 |
1 |
Page1_Draw |
page1被创建时,该函数调用page1的描绘函数来把该页面画出来 |
2 |
Page1_DrawMenuCB |
自己写的回调函数 |
3 |
Page1_HandleEvent |
Page1的事件处理 |
4 |
Page1_Release |
释放page1的所有资源 |
5 |
Page1_HandleEvtKey |
用来处理Key事件 |
6 |
Page1_HandleEvtKey1 |
处理Key1事件,按下1键时跳到第一个菜单项页面即FastSearch页面 |
7 |
Page1_HandleEvtKey2 |
处理Key2事件,按下2键时跳到第二个菜单项页面即NameSearch页面 |
8 |
Page1_HandleEvtKey3 |
处理Key3事件,按下3键时跳到第三个菜单项对应的页面即:Add页面 |
9 |
Page1_HandleEvtKey4 |
处理Key4事件,按下4键时跳到第四个菜单项对应的页面即Delete All页面 |
10 |
Page1_HandleEvtClr |
处理Clr事件,按下Clr键时退出该页面或清楚文本框中已输入的文字 |
11 |
Page1_HandleEvtSoft1 |
处理Soft1事件,按下Soft1键,会进入光标所在位置对应的页面 |
12 |
Page1_HandleEvtSoft2 |
处理Soft2事件,按下Soft2键,会返回到上一页 |
13 |
Page1_HandleEvtSelect |
处理OK键事件,按下OK键则进入光标所在位置对应的页面 |
14 |
Page1_DrawMenu |
通过调用Page1_AddItem回调函数来画该页的菜单 |
15 |
Page1_HandleEvtUP |
UP键处理,当按下UP键时,光标上移,当移到第一个菜单项时,继续按UP键,则光标跳到最后一项 |
16 |
Page1_HandleEvtDOWN |
DOWN键处理,当按下DOWN键时,光标下移,当移到最后一项时,继续按此键,则光标跳到第一项 |
17 |
Page1_AddItem |
通过调用回调函数画菜单项 |
18 |
Page1_Redraw |
被回调函数调用画菜单项,此函数主要是设置光标的大小,及显示资源 |
说明:回调函数Page1_DrawMenuCB是自己写的函数,在Page1_Draw函数中注册为回调函数,再画菜单时就直接有系统自己来调用该函数,来完成该页的菜单的描绘。
5.3.2.2 Page2中的函数列表
在此页面中也用了回调来画菜单,具体的与Page1类似,这里不再列举,
此外 Page2_Draw、Page2_HandleEvent、Page2_Release、Page2_HandleEvtKey、
Page2_HandleEvtKeyClr、Page2_HandleEvtKeySOFT1、Page2_HandleEvtKeySOFT2
Page2_HandleEvtKeySelect、Page2_HandleEvtDOWN、Page2_HandleEvtKeyUP
Page2_DrawCB、Page2_Redraw以上这些函数与Page1中的类似,这里也不再做说明。
下面介绍如何显示记录列表:
实现显示所有记录功能的两个核心函数:
static void Page2_NameList(ST_PAGE2 *pstPage)
static void Page2_AddItem(ST_PAGE2 *pstPage, int itemID)
Page2_NameList()可以通过调用Page2_AddItem()显示所有的记录姓名条目。
其中关键的是通过传递存记录的在缓存Buffer[]的下标,从而把其中的记录取出来,显示在屏幕上。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>