3实验步骤.docx
《3实验步骤.docx》由会员分享,可在线阅读,更多相关《3实验步骤.docx(26页珍藏版)》请在冰豆网上搜索。
3实验步骤
实验三 使用EVC编程实现“文件系统管理”
1.实验目的:
1.熟悉WinCE中文件的基本操作;
2.熟悉在EVC4.0调试嵌入式应用程序的基本方法;
3.掌握控件(Combobox)的使用方法;
4.掌握EditBox(编辑框)、ComboBox(组合框)与成员变量的关联的方法;
5.掌握MFC类库中的CFile类的使用方法。
2.实验任务:
1.使用CFile类来实现对一个学生数据文件的操作
●移动学生记录
●添加一条学生信息
●编辑一条学生信息
●删除一条学生信息
3.实验步骤:
1.使用EVC向导(File->New)新建一个项目
在Projects选项卡选择“WCEPocketPC2003MFCAppWizard(exe)”项,在右侧的Projectname和Location输入栏中分别输入项目的名称和项目的存储路径,如图1所示,这里项目名称设为FileExam。
图1新建项目对话框
输入项目名和路径后,单击OK按钮,进入如图2所示的向导界面的第一步。
在该界面中的应用程序类型中选择Dialogbased(对话框类型),单击Next按钮,进入向导的第2步。
在该界面中输入应用程序的标题,我们直接按照默认操作完成向导即可。
图2向导界面1
2.设置工具栏如下图3所示
图3工具栏(用于设置工程名\SDK\编译类型\目标机器)
3.设计对话框样式。
首先在工作区(WorkSpace)点“ResourceView”标签,双击打开对话框窗体(IDD_FILEEXAM_DIALOG)。
如图4。
图4打开的对话框窗体
设计对话框窗体如图5所示。
可以通过右键单击控件,选择“Properties”
设置控件的“ID”属性和“Caption”属性。
对话框上的主要控件及其属性设置如表1。
图5文件综合操作示例界面
表1 文件综合操作示例界面的控件及其属性设置
控件ID
说明
IDC_EDTXSBH
EditBox(编辑框),用于显示和输入学生编号
IDC_EDTXSXM
EditBox(编辑框),用于显示和输入学生姓名
IDC_CMBXSXB
ComboBox(组合框),用于显示和设置学生性别。
设置Type属性为Dropdown,用户只可以进行选择,并将Data属性设置成”male|female”(先填入male,然后“ctrl+Enter”换行填入female)
IDC_EDTCSRQ
EditBox(编辑框),用于显示和输入出生日期
IDC_EDTBJMC
EditBox(编辑框),用于显示和输入班级名称
IDC_BTNFIRST
Button(按钮),标题Caption设为”First”,用于将记录指针移到首部
IDC_BTNPRIOR
Button(按钮),标题Caption设为”Prior”,用于将记录指针向前移动一个
IDC_BTNNEXT
Button(按钮),标题Caption设为”Next”,用于将记录指针向后移动一个
IDC_BTNLAST
Button(按钮),标题Caption设为”Last”,用于将记录指针移到尾部
IDC_BTNADD
Button(按钮),标题Caption设为”Add”,用于添加新记录
IDC_BTNEDIT
Button(按钮),标题Caption设为”Edit”,用于编辑旧记录
IDC_BTNCANCEL
Button(按钮),标题Caption设为”Cancel”,用于恢复所作的添加或修改
IDC_BTNSAVE
Button(按钮),标题Caption设为”Save”,用于保存所作的添加或修改
IDC_BTNDELETE
Button(按钮),标题Caption设为”Delete”,删除当前记录
4.为4个EditBox(编辑框)和一个ComboBox(组合框)关联成员变量。
在编辑框上点右键,选择“ClassWizard”,如图6。
图6“ClassWizard”
在打开的类向导编辑框,点击“MemberVariables”标签,为4个EditBox(编辑框)和一个ComboBox(组合框)关联成员变量,如图7所示。
关联方法:
双击控件的”ControlIDs”,打开对话框,按照下表2输入类型和成员变量名称。
表2关联列表
ID名称
类型
变量名
IDC_EDTXSBH
CString
m_xsbh
IDC_EDTXSXM
CString
m_xsxm
IDC_CMBXSXB
CString
m_xsxb
IDC_EDTCSRQ
CString
m_csrq
IDC_EDTBJMC
CString
m_bjmc
图7对应关联
5.定义学生基本信息结构。
在对话框头文件(FileExamDlg.h)中定义学生基本信息结构,定义的结构如下(此段代码添加到对话框类CFileExamDlg定义之前):
#pragmapack(push,1)
//定义学生基本信息结构
typedefstruct_CStudentData
{
TCHARxsbh[7];//学生编号
TCHARxsxm[21];//学生姓名
TCHARxb[10];//学生性别
TCHARcsrq[11];//出生日期
TCHARbjmc[21];//班级名称
}CStudentData;
#pragmapack(pop)
接着再定义一个全局常量来表示存储学生信息的文件名(此段代码添加到对话框类CFileExamDlg定义之前)。
constLPCTSTRSTUDENTFILEPATH=_T("\\MyDocuments\\student.dat");
6.定义私有变量。
定义一个列表以存储学生的基本信息,因此在对话框类中添加如下代码以定义私有变量(添加到类CFileExamDlg的定义文件FileExamDlg.h,注意:
放到类CFileExamDlg的里面)
private:
//定义存储学生数据表的队列
CListm_lstStudent;
//定义操作标识,0-代表添加;1-代表编辑
intm_operID;
//存储指针位置
intm_iCurPos;
7.添加头文件。
在对话框头文件(FileExamDlg.h)中加上#include这句代码,因为我们声明的列表变量用到了标准模板库。
(放在”#endif//_MSC_VER>=1000”之后)
8.定义私有方法。
为对话框类添加两个私有方法SetControlEnable和SetNavigatorButton,分别用于设置窗体上控件的有效性和指针移动按钮的有效性,他们的声明代码如下:
(添加到类CFileExamDlg的定义文件FileExamDlg.h,注意:
放到类CFileExamDlg的里面)
private:
//设置控件有效性
voidSetControlEnable(boolaValue);
//设置指针移动按钮的有效性
voidSetNavigatorButton(intaValue);
以上两个方法的实现代码如下:
(添加到FileExamDlg.cpp中)
/*
*函数介绍:
设置控件有效性
*入口参数:
aValue代表控件的有效性
*出口参数:
(无)
*返回值:
(无)
*/
voidCFileExamDlg:
:
SetControlEnable(boolaValue)
{
/*设置输入框的有效性*/
((CEdit*)GetDlgItem(IDC_EDTXSBH))->EnableWindow(aValue);
((CEdit*)GetDlgItem(IDC_EDTXSXM))->EnableWindow(aValue);
((CEdit*)GetDlgItem(IDC_CMBXSXB))->EnableWindow(aValue);
((CEdit*)GetDlgItem(IDC_EDTCSRQ))->EnableWindow(aValue);
((CEdit*)GetDlgItem(IDC_EDTBJMC))->EnableWindow(aValue);
/*设置指针移动按钮的有效性*/
((CButton*)GetDlgItem(IDC_BTNFIRST))->EnableWindow(!
aValue);
((CButton*)GetDlgItem(IDC_BTNPRIOR))->EnableWindow(!
aValue);
((CButton*)GetDlgItem(IDC_BTNNEXT))->EnableWindow(!
aValue);
((CButton*)GetDlgItem(IDC_BTNLAST))->EnableWindow(!
aValue);
/*设置操作按钮的有效性*/
((CButton*)GetDlgItem(IDC_BTNADD))->EnableWindow(!
aValue);
((CButton*)GetDlgItem(IDC_BTNEDIT))->EnableWindow(!
aValue);
((CButton*)GetDlgItem(IDC_BTNCANCEL))->EnableWindow(aValue);
((CButton*)GetDlgItem(IDC_BTNSAVE))->EnableWindow(aValue);
((CButton*)GetDlgItem(IDC_BTNDELETE))->EnableWindow(!
aValue);
}
/*
*函数介绍:
设置指针移动按钮的有效性
*入口参数:
aValue代表当前记录位置
*出口参数:
(无)
*返回值:
(无)
*/
voidCFileExamDlg:
:
SetNavigatorButton(intaValue)
{
//如果学生队列数据小于2
if(m_lstStudent.GetCount()<2)
{
((CButton*)GetDlgItem(IDC_BTNFIRST))->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_BTNPRIOR))->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_BTNNEXT))->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_BTNLAST))->EnableWindow(FALSE);
return;
}
//指针移到首部
if(aValue==0)
{
((CButton*)GetDlgItem(IDC_BTNFIRST))->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_BTNPRIOR))->EnableWindow(FALSE);
if(m_lstStudent.GetCount()>=2)
{
((CButton*)GetDlgItem(IDC_BTNNEXT))->EnableWindow(TRUE);
((CButton*)GetDlgItem(IDC_BTNLAST))->EnableWindow(TRUE);
}
}//如果指针移到末尾
elseif(aValue==m_lstStudent.GetCount()-1)
{
((CButton*)GetDlgItem(IDC_BTNNEXT))->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_BTNLAST))->EnableWindow(FALSE);
if(m_lstStudent.GetCount()>=2)
{
((CButton*)GetDlgItem(IDC_BTNFIRST))->EnableWindow(TRUE);
((CButton*)GetDlgItem(IDC_BTNPRIOR))->EnableWindow(TRUE);
}
}
else
{
((CButton*)GetDlgItem(IDC_BTNFIRST))->EnableWindow(TRUE);
((CButton*)GetDlgItem(IDC_BTNPRIOR))->EnableWindow(TRUE);
((CButton*)GetDlgItem(IDC_BTNNEXT))->EnableWindow(TRUE);
((CButton*)GetDlgItem(IDC_BTNLAST))->EnableWindow(TRUE);
}
}
9.添加指针移动按钮的单击事件代码。
在对话框窗体上直接双击按钮,EVC便会自动创建它的单击方法声明。
其中”First”、”Prior”、”Next”、”Last”按钮的单击事件实现代码如下:
/*
*函数介绍:
将指针移到首部
*入口参数:
(无)
*出口参数:
(无)
*返回值:
(无)
*/
voidCFileExamDlg:
:
OnBtnfirst()
{
CStudentDatastudentData=m_lstStudent.GetHead();
m_iCurPos=0;
//更新显示
m_xsbh=studentData.xsbh;
m_xsxm=studentData.xsxm;
m_xsxb=studentData.xb;
m_csrq=studentData.csrq;
m_bjmc=studentData.bjmc;
UpdateData(false);
//设置指针移动按钮有效性
SetNavigatorButton(m_iCurPos);
}
/*
*函数介绍:
将指针移向前移动
*入口参数:
(无)
*出口参数:
(无)
*返回值:
(无)
*/
voidCFileExamDlg:
:
OnBtnprior()
{
m_iCurPos--;
POSITIONpos=m_lstStudent.FindIndex(m_iCurPos);
CStudentDatastudentData=m_lstStudent.GetAt(pos);
//更新显示
m_xsbh=studentData.xsbh;
m_xsxm=studentData.xsxm;
m_xsxb=studentData.xb;
m_csrq=studentData.csrq;
m_bjmc=studentData.bjmc;
UpdateData(false);
//设置指针移动按钮有效性
SetNavigatorButton(m_iCurPos);
}
/*
*函数介绍:
将指针向后移动
*入口参数:
(无)
*出口参数:
(无)
*返回值:
(无)
*/
voidCFileExamDlg:
:
OnBtnnext()
{
m_iCurPos++;
POSITIONpos=m_lstStudent.FindIndex(m_iCurPos);
CStudentDatastudentData=m_lstStudent.GetAt(pos);
//更新显示
m_xsbh=studentData.xsbh;
m_xsxm=studentData.xsxm;
m_xsxb=studentData.xb;
m_csrq=studentData.csrq;
m_bjmc=studentData.bjmc;
UpdateData(false);
//设置指针移动按钮有效性
SetNavigatorButton(m_iCurPos);
}
/*
*函数介绍:
将指针移到尾部
*入口参数:
(无)
*出口参数:
(无)
*返回值:
(无)
*/
voidCFileExamDlg:
:
OnBtnlast()
{
CStudentDatastudentData=m_lstStudent.GetTail();
m_iCurPos=m_lstStudent.GetCount()-1;
//更新显示
m_xsbh=studentData.xsbh;
m_xsxm=studentData.xsxm;
m_xsxb=studentData.xb;
m_csrq=studentData.csrq;
m_bjmc=studentData.bjmc;
UpdateData(false);
//设置指针移动按钮有效性
SetNavigatorButton(m_iCurPos);
}
10.添加“添加”、“编辑”、“恢复”、“保存”、“删除”按钮的单击事件代码。
在对话框窗体上直接双击按钮,EVC便会自动创建它的单击方法声明。
其中”Add”、”Edit”、”Cancel”、”Save”、”Delete”按钮的单击事件实现代码如下:
/*
*函数介绍:
添加新记录
*入口参数:
(无)
*出口参数:
(无)
*返回值:
(无)
*/
voidCFileExamDlg:
:
OnBtnadd()
{
m_operID=0;//表示添加操作
m_xsbh=_T("");
m_xsxm=_T("");
m_xsxb=_T("");
m_csrq=_T("");
m_bjmc=_T("");
UpdateData(FALSE);
SetControlEnable(TRUE);
}
/*
*函数介绍:
编辑旧记录
*入口参数:
(无)
*出口参数:
(无)
*返回值:
(无)
*/
voidCFileExamDlg:
:
OnBtnedit()
{
if(m_lstStudent.IsEmpty())
{
AfxMessageBox(_T("NorecordcanbeEdited!
"));
return;
}
m_operID=1;//表示编辑操作
SetControlEnable(TRUE);
}
/*
*函数介绍:
保存修改或添加
*入口参数:
(无)
*出口参数:
(无)
*返回值:
(无)
*/
voidCFileExamDlg:
:
OnBtnsave()
{
CStudentDatastudentData;
CFilestuFile;
UpdateData(TRUE);
switch(m_operID)
{
case0:
/*添加操作*/
{
/*将添加的东西写入文件*/
ZeroMemory(&studentData,sizeof(studentData));
wcscpy(studentData.xsbh,m_xsbh);
wcscpy(studentData.xsxm,m_xsxm);
wcscpy(studentData.xb,m_xsxb);
wcscpy(studentData.csrq,m_csrq);
wcscpy(studentData.bjmc,m_bjmc);
stuFile.Open(STUDENTFILEPATH,CFile:
:
modeRead|CFile:
:
modeWrite);
stuFile.SeekToEnd();
stuFile.Write(&studentData,sizeof(studentData));
stuFile.Close();
//更新内存队列
m_lstStudent.AddTail(studentData);
SetControlEnable(FALSE);
//设置指针移动按钮有效性
m_iCurPos=m_lstStudent.GetCount()-1;
SetNavigatorButton(m_iCurPos);
break;
}
case1:
/*编辑操作*/
{
/*将添加的东西写入文件*/
ZeroMemory(&studentData,sizeof(studentData));
wcscpy(studentData.xsbh,m_xsbh);
wcscpy(studentData.xsxm,m_xsxm);
wcscpy(studentData.xb,m_xsxb);
wcscpy(studentData.csrq,m_csrq);
wcscpy(studentData.bjmc,m_bjmc);
stuFile.Open(STUDENTFILEPATH,CFile:
:
modeRead|CFile:
:
modeWrite);
stuFile.Seek(sizeof(studentData)*(m_iCurPos),CFile:
:
begin);
stuFile.Write(&studentData,sizeof(studentData));
stuFile.Close();
//更新内存队列
m_lstStudent.SetAt(m_lstStudent.FindIndex(m_iCurPos),studentData);
SetControlEnable(FALSE);
//设置指针移动按钮有效性
SetNavigatorButton(m_iCurPos);
break;
}
}
}
/*
*函数介绍:
取消修改或添加
*入口参数:
(无)
*出口参数:
(无)
*返回值:
(无)
*/
voidCFileExamDlg:
:
OnBtncancel()
{
POSITIONpos=m_lstStudent.FindIndex(m_iCurPos);
CStudentDatastudentData=m_lstStudent.GetAt(pos);
//更新显示
m_xsbh=studentData.xsbh;
m_xsxm=studentData.xsxm;
m_xsxb=studentData.xb;
m_csrq=studentData.csrq;
m_bjmc=studentData.bjmc;
UpdateData(false);
SetControlEnable(FALSE);
//设置指针移动按钮有效性
SetNavigatorButto