基于Windows CE的嵌入式通讯录软件设计与实现
2013-01-19朱雅莉
李 浪,胡 骏,刘 辉,朱雅莉
(衡阳师范学院 计算机科学系,湖南 衡阳 421002)
0 引 言
嵌入式软件广泛应用于人民生活中的各个方面,如工业控制、消费电子、通信产业。Windows CE是微软公司力推的嵌入式操作系统,由于微软公司强大的影响力,基于Windows CE平台的嵌入式软件开发引起了IT界足够重视与应用[1-2]。
本文详细论述了在VS2008环境中基于Windows CE的通讯录软件设计与实现,对通讯录程序主要界面及功能进行了设计,对程序关键模块进行了实现,最后对嵌入式程序开发需要注意的要点进行了分析与讨论。
1 嵌入式软件开发流程
嵌入式软件开发与通用软件开发存在着一定区别,嵌入式应用软件开发需要程序员对底层有一定了解,但随着嵌入式软件开发工具与技术的迅速发展,目前嵌入式软件开发人员对底层及接口所需的了解程度要求越来越不高。嵌入式系统的层次结构如图1。
图1 嵌入式系统的层次结构图
嵌入式软件开发一般流程如图2,其中与通用软件开发体现区别的是即使应用程序调试通过,仍然需要把应用软件下载到嵌入式系统板上进行整个系统的软硬件测试。
2 基于Windows CE的通讯录软件设计与实现
2.1 程序主要界面以及功能介绍
在Windows CE 6.0(POCKET PC 2003)模拟器中打开通讯录软件界面如图3所示,通讯录软件由三个编辑框和八个按钮组成,按钮分别为First(最前)、Last(最后)、Up(上移)、Down(下移)、Add(添加)、Delete(删除)、Save(保存)和Edit(修改)。
2.2 各个主要功能模块的实现
首先创建项目,根据程序的特性在VS2008中编译语言选择C++,调试环境为智能设备,MFC智能设备应用程序,在内置SDK中选择平台,默认平台为Windows Mobile 5.0(PPC),此时可以添加一个Pocket PC 2003平台。应用程序类型选择基于对话框,MFC的使用则为在静态库中使用MFC[3-4]。
(1)首先将需要保存的记录(姓名,电话,邮件)写成一个结构体,其实现代码如下:
typedef struct_CComData
{
TCHAR name[n];//n为自定义最长字符串长
TCHAR number[n];
TCHAR mail[n];
}CComData;
(2)建立需要保存记录的文件地址(在实际编程中特别注意路径要设置为根目录,Windows CE下My Documents文件夹前不需要盘符,若擅自添加盘符则会导致文件创建失败):
Const LPCTSTR FILEPATH=_T(“\My Documents\communication.dat”)
(3)在对话框中拖入所需要的控件,并且编辑好控件属性,如图4。
图4 控件属性编辑
(4)添加完毕后需要编写相应的函数。首先编写OnInitDialog()函数,OnInitDialog()函数用来判定在打开程序时是否能打开文件已经存在的记录,如果无法打开文件,则按照路径创建该文件,创建失败时则提示错误,如果可以打开已经存在的记录,则显示第一条记录。
(5)编写SetControlEnable()函数,该函数主要用来设置输入框,指针及操作按钮的有效性。
(6)编写SetButtonEnable()函数,用来移动记录时设置指针的有效性。如当文件记录小于两条时,则四个指针按钮都为不可用。
void CLCComDlg::SetButtonEnable(int aValue)
{
if(m_lstCom.GetCount()<2)
{
((CButton*)GetDlgItem(IDC_BUT
TON_FIRST))->EnableWindow(FALSE);((CButton*)GetDlgItem(IDC_BUT
TON_UP))->EnableWindow(FALSE);((CButton*)GetDlgItem(IDC_BUT
TON_DOWN))->EnableWindow(FALSE);((CButton*)GetDlgItem(IDC_BUT
TON_LAST))->EnableWindow(FALSE);
}
}
(7)针对Add按钮,编写OnButtonAdd()。将输入框设为可用,清除输入框内容使之处于输入状态。
{
m_operID=0;
m_Name=_T("");
m_Number=_T("");
m_Mail=_T("");
UpdateData(FALSE);
SetControlEnable(TRUE);
}
(8)编写OnButtonDelete()函数,首先要从m_ListCom链表中删除这条记录,删除之后判定是否还有其他记录,如果有的话显示它前面的一条记录,没有则显示空,并且输入框状态不可用。重新遍历链表并且按照路径创建文件,将链表的记录一条条地写进文件中。
{
if(m_lstCom.IsEmpty())
{
AfxMessageBox(_T("There is no Data!"));
return;
}
//先从队列中移除
POSITION pos=m_lstCom.FindIndex(m_iCurPos);
m_lstCom.RemoveAt(pos);
if(m_iCurPos!=0)
{
m_iCurPos--;
}
if(!m_lstCom.IsEmpty())
{
pos=m_lstCom.FindIndex(m_iCur-Pos);
CComData ComData=m_lstCom.GetAt(pos);
//更新显示
m_Name=ComData.name;
m_Number=ComData.number;
m_Mail=ComData.mail;
UpdateData(FALSE);
}
else
{
//更新显示
m_Name=_T("");
m_Number=_T("");
m_Mail=_T("");
UpdateData(FALSE);
}
SetControlEnable(FALSE);//设置移动指针按钮有效性
SetButtonEnable(m_iCurPos);//将文件重写
CComData ComData;
CFile ComFile;
ComFile.Open(FILEPATH,CFile::modeCreate|CFile::modeWrite);
pos=m_lstCom.GetHeadPosition();
for(int i=0;i<m_lstCom.GetCount();++i)
{
ComData=m_lstCom.GetNext(pos);
ComFile.Write(&ComData,sizeof(ComData));
}
ComFile.Close();
}
(9)编写OnButtonEdit()函数,若链表队列中没有数据,则提示错误,否则将输入框的状态改为可用,并设置m_operID为编辑操作。
{
if(m_lstCom.IsEmpty())
{
AfxMessageBox(_T("No record to edit!"));
return;
}
m_operID=1;//表示编辑操作
//UpdateData(FALSE);
SetControlEnable(TRUE);
}
(10)编写OnButtonSave()函数,根据m_oper-ID来判定是添加操作之后进行的保存操作,还是编辑之后进行的保存操作。如果是添加操作之后进行的保存,那么将输入的记录复制到结构体中相应的数组中,然后打开文件,将文件指针移至最末端,把该条记录写入即可。如果是编辑之后进行的保存操作,则将输入的记录复制到结构体中相应的数组中后根据m_iCuiPos来找到该条记录在文件存取的位置,重写该条记录之后再进行保存即可。
(11)操作按钮函数编写完成之后,编写指针按钮。向上移动一条记录时先将m_iCurPos减一,表示向上移动一条记录,然后根据m_iCurPos做索引来找到相对应的在m_lstCom中的记录,再将这条记录复制给输入框变量并显示,同时设置按钮有效性。
3 分析与讨论
编写消息处理函数时出现了不响应或者是部分模块失效的情况,则需要使用afxmessagebox来解决,它是基于框架的函数,使用起来非常方便。Windows CE下My Documents默认的路径为C盘根目录,而编写程序时就需要将路径改为根目录。
传统的Windows CE开发方式,首先需要在PC上进行Windows CE开发环境的搭建,经过软件安装,Service Pack补丁包安装和Platform Builder for CE 6.0的安装等繁琐过程,安装完毕后还需对开发环境进行定制,在这期间由于开发人员的PC配置,软件环境,安装包完整性等不确定差异,极易造成各种兼容性问题,导致开发环境搭建失败,而VS2008中内置了Windows CE(POCKET PC 2003/MOBILE 5.0)的SDK(软件开发工具包),直接提供完整的开发环境,解决了由于开发人员PC配置等差异带来的兼容性问题,为基于Windows CE嵌入式编程带来了相当便利。这也是本文的一个重要目的,就是叙述把传统的Windows CE5.0环境下的嵌入式编程移植到VS2008下开发,而且从本文的移植过程可以得出程序移植所需实质性改动并不大。
[1]臧佳锋,戴月明.基于Windows CE的嵌入式电子邮件系统设 计 与 实 现[J].微 计 算 机 信 息,2006,22(2-2):89-92
[2]曾喆,李涛,朱才连.基于Windows CE的嵌入式导航软件设计与实现[J].计算机应用,2004,24(6):357-359.
[3]李浪,刘宏,熊江.嵌入式软件开发实用教程[M].武汉:华中科技大学出版社,2011.7.
[4]彭蔓蔓,李浪.嵌入式系统导论[M].北京:人民邮电大学出版社,2008.