1、3实验步骤实验三使用EVC编程实现“文件系统管理”1实验目的:1. 熟悉Win CE中文件的基本操作;2. 熟悉在EVC4.0调试嵌入式应用程序的基本方法;3. 掌握控件(Combo box)的使用方法;4. 掌握Edit Box(编辑框)、Combo Box(组合框)与成员变量的关联的方法;5. 掌握MFC类库中的CFile类的使用方法。2实验任务:1. 使用CFile类来实现对一个学生数据文件的操作 移动学生记录 添加一条学生信息 编辑一条学生信息 删除一条学生信息3实验步骤:1. 使用EVC向导(File-New)新建一个项目在Projects选项卡选择“WCE Pocket PC 20
2、03 MFC AppWizard(exe)”项,在右侧的Project name和Location输入栏中分别输入项目的名称和项目的存储路径,如图1所示,这里项目名称设为FileExam。图1 新建项目对话框输入项目名和路径后,单击OK按钮,进入如图2所示的向导界面的第一步。在该界面中的应用程序类型中选择Dialog based(对话框类型),单击Next按钮,进入向导的第2步。在该界面中输入应用程序的标题,我们直接按照默认操作完成向导即可。图2 向导界面2. 设置工具栏如下图3所示图3工具栏(用于设置工程名SDK编译类型目标机器)3. 设计对话框样式。 首先在工作区(WorkSpace)点“
3、ResourceView”标签,双击打开对话框窗体(IDD_FILEEXAM _DIALOG)。如图4。 图4 打开的对话框窗体 设计对话框窗体如图5所示。可以通过右键单击控件,选择“Properties”设置控件的“ID”属性和“Caption”属性。对话框上的主要控件及其属性设置如表1。图5文件综合操作示例界面 表1文件综合操作示例界面的控件及其属性设置控件ID说明IDC_EDTXSBHEdit Box(编辑框),用于显示和输入学生编号IDC_EDTXSXMEdit Box(编辑框),用于显示和输入学生姓名IDC_CMBXSXBCombo Box(组合框),用于显示和设置学生性别。设置Ty
4、pe属性为Drop down,用户只可以进行选择,并将Data属性设置成”male|female”(先填入male,然后“ctrl+Enter”换行填入female)IDC_EDTCSRQEdit Box(编辑框),用于显示和输入出生日期IDC_EDTBJMCEdit Box(编辑框),用于显示和输入班级名称IDC_BTNFIRSTButton(按钮) ,标题Caption设为”First”,用于将记录指针移到首部IDC_BTNPRIORButton(按钮) ,标题Caption设为”Prior”,用于将记录指针向前移动一个IDC_BTNNEXTButton(按钮) ,标题Caption设为”
5、Next”,用于将记录指针向后移动一个IDC_BTNLASTButton(按钮) ,标题Caption设为”Last”, 用于将记录指针移到尾部IDC_BTNADDButton(按钮) ,标题Caption设为”Add”, 用于添加新记录IDC_BTNEDITButton(按钮) ,标题Caption设为”Edit”, 用于编辑旧记录IDC_BTNCANCELButton(按钮) ,标题Caption设为”Cancel”,用于恢复所作的添加或修改IDC_BTNSAVEButton(按钮) ,标题Caption设为”Save”, 用于保存所作的添加或修改IDC_BTNDELETEButton(按
6、钮) ,标题Caption设为”Delete”,删除当前记录4. 为4个Edit Box(编辑框)和一个Combo Box(组合框)关联成员变量。在编辑框上点右键,选择“ClassWizard”,如图6。图6 “Class Wizard” 在打开的类向导编辑框,点击“Member Variables”标签,为4个Edit Box(编辑框) 和一个Combo Box(组合框)关联成员变量,如图7所示。 关联方法:双击控件的”Control IDs”,打开对话框,按照下表2输入类型和成员变量名称。表2 关联列表ID名称类型变量名IDC_EDTXSBHCString m_xsbhIDC_EDTXSX
7、MCStringm_xsxmIDC_CMBXSXBCStringm_xsxbIDC_EDTCSRQCStringm_csrqIDC_EDTBJMCCStringm_bjmc图7 对应关联5. 定义学生基本信息结构。 在对话框头文件(FileExamDlg.h)中定义学生基本信息结构,定义的结构如下(此段代码添加到对话框类CFileExamDlg定义之前): #pragma pack(push,1)/定义学生基本信息结构typedef struct _CStudentData TCHAR xsbh7; /学生编号 TCHAR xsxm21; /学生姓名 TCHAR xb10; /学生性别 TCH
8、AR csrq11; /出生日期 TCHAR bjmc21; /班级名称CStudentData;#pragma pack(pop)接着再定义一个全局常量来表示存储学生信息的文件名(此段代码添加到对话框类CFileExamDlg定义之前)。const LPCTSTR STUDENTFILEPATH = _T(My Documentsstudent.dat);6. 定义私有变量。定义一个列表以存储学生的基本信息,因此在对话框类中添加如下代码以定义私有变量 (添加到类CFileExamDlg的定义文件FileExamDlg.h,注意:放到类CFileExamDlg的里面)private: /定义存
9、储学生数据表的队列 CList m_lstStudent; /定义操作标识, 0 - 代表添加; 1 - 代表编辑 int m_operID ; /存储指针位置 int m_iCurPos; 7. 添加头文件。在对话框头文件(FileExamDlg.h)中加上#include 这句代码,因为我们声明的列表变量用到了标准模板库。(放在”#endif / _MSC_VER = 1000”之后)8. 定义私有方法。为对话框类添加两个私有方法SetControlEnable和SetNavigatorButton,分别用于设置窗体上控件的有效性和指针移动按钮的有效性,他们的声明代码如下:(添加到类CFi
10、leExamDlg的定义文件FileExamDlg.h,注意:放到类CFileExamDlg的里面)private:/设置控件有效性void SetControlEnable(bool aValue);/设置指针移动按钮的有效性void SetNavigatorButton(int aValue);以上两个方法的实现代码如下:(添加到FileExamDlg.cpp中)/*函数介绍:设置控件有效性*入口参数:aValue代表控件的有效性*出口参数:(无)*返回值:(无)*/void CFileExamDlg:SetControlEnable(bool aValue) /*设置输入框的有效性*/
11、(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*)Get
12、DlgItem(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*)Ge
13、tDlgItem(IDC_BTNEDIT)-EnableWindow(!aValue); (CButton*)GetDlgItem(IDC_BTNCANCEL)-EnableWindow(aValue); (CButton*)GetDlgItem(IDC_BTNSAVE)-EnableWindow(aValue); (CButton*)GetDlgItem(IDC_BTNDELETE)-EnableWindow(!aValue);/*函数介绍:设置指针移动按钮的有效性*入口参数:aValue代表当前记录位置*出口参数:(无)*返回值:(无)*/void CFileExamDlg:SetNavi
14、gatorButton(int aValue) /如果学生队列数据小于2 if (m_lstStudent.GetCount() 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*)GetDlg
15、Item(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); /如果指针移到末尾 else if (aValue = m_lstStudent.GetCount() - 1) (CButto
16、n*)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(TR
17、UE); (CButton*)GetDlgItem(IDC_BTNPRIOR)-EnableWindow(TRUE); (CButton*)GetDlgItem(IDC_BTNNEXT)-EnableWindow(TRUE); (CButton*)GetDlgItem(IDC_BTNLAST)-EnableWindow(TRUE); 9. 添加指针移动按钮的单击事件代码。在对话框窗体上直接双击按钮,EVC便会自动创建它的单击方法声明。其中”First”、 ”Prior”、 ”Next” 、 ”Last”按钮的单击事件实现代码如下:/*函数介绍:将指针移到首部*入口参数:(无)*出口参数:(无)
18、*返回值:(无)*/void CFileExamDlg:OnBtnfirst() CStudentData studentData = 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_i
19、CurPos);/*函数介绍:将指针移向前移动*入口参数:(无)*出口参数:(无)*返回值:(无)*/void CFileExamDlg:OnBtnprior() m_iCurPos-; POSITION pos = m_lstStudent.FindIndex(m_iCurPos); CStudentData studentData = m_lstStudent.GetAt(pos); /更新显示 m_xsbh = studentData.xsbh; m_xsxm = studentData.xsxm; m_xsxb = studentData.xb; m_csrq = studentDat
20、a.csrq; m_bjmc = studentData.bjmc; UpdateData(false); /设置指针移动按钮有效性 SetNavigatorButton(m_iCurPos);/*函数介绍:将指针向后移动*入口参数:(无)*出口参数:(无)*返回值:(无)*/void CFileExamDlg:OnBtnnext() m_iCurPos+; POSITION pos = m_lstStudent.FindIndex(m_iCurPos); CStudentData studentData = m_lstStudent.GetAt(pos); /更新显示 m_xsbh = st
21、udentData.xsbh; m_xsxm = studentData.xsxm; m_xsxb = studentData.xb; m_csrq = studentData.csrq; m_bjmc = studentData.bjmc; UpdateData(false); /设置指针移动按钮有效性 SetNavigatorButton(m_iCurPos);/*函数介绍:将指针移到尾部*入口参数:(无)*出口参数:(无)*返回值:(无)*/void CFileExamDlg:OnBtnlast() CStudentData studentData = m_lstStudent.GetT
22、ail(); 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. 添加“添加”、“编辑”、“恢复”、“保存”、“删除”按钮的单击事件代码。在对话框窗体上直接双击
23、按钮,EVC便会自动创建它的单击方法声明。其中”Add”、 ”Edit”、 ”Cancel” 、 ”Save” 、 ”Delete”按钮的单击事件实现代码如下:/*函数介绍:添加新记录*入口参数:(无)*出口参数:(无)*返回值:(无)*/void CFileExamDlg:OnBtnadd() m_operID = 0 ; /表示添加操作 m_xsbh = _T(); m_xsxm = _T(); m_xsxb = _T(); m_csrq = _T(); m_bjmc = _T(); UpdateData(FALSE); SetControlEnable(TRUE);/*函数介绍:编辑旧记
24、录*入口参数:(无)*出口参数:(无)*返回值:(无)*/void CFileExamDlg:OnBtnedit() if (m_lstStudent.IsEmpty() AfxMessageBox(_T(No record can be Edited!); return; m_operID = 1 ; /表示编辑操作 SetControlEnable(TRUE);/*函数介绍:保存修改或添加*入口参数:(无)*出口参数:(无)*返回值:(无)*/void CFileExamDlg:OnBtnsave() CStudentData studentData; CFile stuFile; Upd
25、ateData(TRUE); switch (m_operID ) case 0 : /*添加操作*/ /*将添加的东西写入文件*/ 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(STUDENTFILEP
26、ATH,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; case 1: /*编辑操作*/
27、/*将添加的东西写入文件*/ 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(
28、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; /*函数介绍:取消修改或添加*入口参数:(无)*出口参数:(无)*返回值:
29、(无)*/void CFileExamDlg:OnBtncancel() POSITION pos = m_lstStudent.FindIndex(m_iCurPos); CStudentData studentData = 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
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1