//AFX DATA(CEmpDlg) enum I IDD= IDD EMPLOYEE ColeDateTime m bIrthdate EStrin m strDept BOOL m mArried float m fSalary Cstring m strName t EStrin m strPosition //)AFX DATA // ClassWizard generated virtual function overrides //AFX VIRTUAL(CEmpDlg) rotected: virtual void DoDataExchange(CDataExchange* pDX):// DDX/DDV support //)AFX VIRTUAL 7/ Implementation protected 7/ Generated message map functions //AFX MSG(CEmpDlg) virtual BOOL OnInitDialog o //)AFX MSG DECLARE MESSAGE MAP O 对话框类的构造函数和 DoDataExchange()成员函数也是由 ClassWizard自动维护的: CEmpDlg: CEmpDlg(CWnd* pArent /==NULL*/) CDialog(CempDlg: IDD, pArent) //AFX DATA INIT(CEmpDlg) m bIrthdate= COle Time:: Get Current Time o m strDept m fSalary =0. of //)AFX DATA INIT
第 15 单元 控件 308 //{{AFX_DATA(CEmpDlg) enum { IDD = IDD_EMPLOYEE }; ColeDateTime m_tBirthdate; CString m_strDept; BOOL m_bMarried; float m_fSalary; Cstring m_strName; int m_nSex; CString m_strPosition; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CEmpDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CEmpDlg) virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; 对话框类的构造函数和 DoDataExchange()成员函数也是由 ClassWizard 自动维护的: CEmpDlg::CEmpDlg(CWnd* pParent /*=NULL*/) : CDialog(CEmpDlg::IDD, pParent) { //{{AFX_DATA_INIT(CEmpDlg) m_tBirthdate = COleDateTime::GetCurrentTime(); m_strDept = _T(""); m_bMarried = FALSE; m_fSalary = 0.0f; m_strName = _T(""); m_nSex = -1; m_strPosition = _T(""); //}}AFX_DATA_INIT }
15单元控件 void CEmpDlg: DoData Exchange( CDataExchange* pDX) CDialog: DoDataExchange(pDX) //HAFX DATA MAP(CEmpDlg) DDX Text(pDX, IDC BIRTHDATE, m tBirthdate) DDX LBString(pDX, IDC DEPT, m strDept) DDX Check(pDX, IDC MARRIED, m bMarried) DDX Text(pDX, IDC SALARY, m fSalary DDV MinMax Float(pDX, m fSalary, 0.f, 10000. f) DDX Text(pDX, IDC NAME, m strName) DDV Max Chars (pDX, m strName, 20) DDX Radio(pDX, IDC MALE, m nSex) DDX CBString(pDX, IDC POSiTioN, m strPosition) DDV MaxChars(p //)AFX DATA MAP 其中构造函数中有 CEmpDlg类各数据成员的初始化代码, DoDataExchange()函数中为这 些数据成员与控件之间的数据交换和数据检验代码 接着,还应编辑项目的菜单资源,在框架窗口的主菜单( IDR MAINFRAME)中添加 两个菜单选项,并为下拉菜单“编辑”添加三个菜单选项 Prompt ID NEXI下一记录 下一职工档案n下一记录 ID PREV上一记录 上一职工档案Ⅶn上一记录” ID APPEND输入(&I)Cr+l输入新职工档案ln输入 ID EDIT编辑(&E)crH+E编辑职工档案n编辑 ID DELETE删除(&D)\CtH+D删除职工档案Ⅶn删除 然后利用 ClassWizard为视图类添加与这些菜单选项对应的成员函数。进入在 Classwizard 的 Message Maps选项卡,选择 Class Name项为 CMy View,在 Object IDs列表框中分别选 择新添加的菜单选项的ID,在 Messages列表框中选择 COMMAND,按下 Add function按 钮添加成员函数。 Class wizard会为这些菜单选项添加相应的消息响应函数(目前尚没有具 体内容,需要程序员自行加入有关的处理代码),并将其声明加入 CMy View类定义,在消 息映射宏中加入相应的消息映射 完成以上工作后,即可修改程序框架,添加必要的代码。 程序:由于列表框尚未初始化,所以为 CEmpDlg类重载 OnInitDialog()成员函 数(可使用 ClassWizard完成),并添加相应代码 BOOL CEmpDlg:: OnInitDialogo
第 15 单元 控件 309 void CEmpDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CEmpDlg) DDX_Text(pDX, IDC_BIRTHDATE, m_tBirthdate); DDX_LBString(pDX, IDC_DEPT, m_strDept); DDX_Check(pDX, IDC_MARRIED, m_bMarried); DDX_Text(pDX, IDC_SALARY, m_fSalary); DDV_MinMaxFloat(pDX, m_fSalary, 0.f, 10000.f); DDX_Text(pDX, IDC_NAME, m_strName); DDV_MaxChars(pDX, m_strName, 20); DDX_Radio(pDX, IDC_MALE, m_nSex); DDX_CBString(pDX, IDC_POSITION, m_strPosition); DDV_MaxChars(pDX, m_strPosition, 20); //}}AFX_DATA_MAP } 其中构造函数中有 CEmpDlg 类各数据成员的初始化代码,DoDataExchange()函数中为这 些数据成员与控件之间的数据交换和数据检验代码。 接着,还应编辑项目的菜单资源,在框架窗口的主菜单(IDR_MAINFRAME)中添加 两个菜单选项,并为下拉菜单“编辑”添加三个菜单选项: ID Caption Prompt ID_NEXT 下一记录 下一职工档案\n 下一记录 ID_PREV 上一记录 上一职工档案\n 上一记录” ID_APPEND 输入(&I)\tCtrl+I 输入新职工档案\n 输入 ID_EDIT 编辑(&E)\tCtrl+E 编辑职工档案\n 编辑 ID_DELETE 删除(&D)\tCtrl+D 删除职工档案\n 删除 然后利用 ClassWizard 为视图类添加与这些菜单选项对应的成员函数。进入在 ClassWizard 的 Message Maps 选项卡,选择 Class Name 项为 CMyView,在 Object IDs 列表框中分别选 择新添加的菜单选项的 ID,在 Messages 列表框中选择 COMMAND,按下 Add Function 按 钮添加成员函数。ClassWizard 会为这些菜单选项添加相应的消息响应函数(目前尚没有具 体内容,需要程序员自行加入有关的处理代码),并将其声明加入 CMyView 类定义,在消 息映射宏中加入相应的消息映射。 完成以上工作后,即可修改程序框架,添加必要的代码。 程 序:由于列表框尚未初始化,所以为 CEmpDlg 类重载 OnInitDialog()成员函 数(可使用 ClassWizard 完成),并添加相应代码: BOOL CEmpDlg::OnInitDialog() {
CListBox *pLB =(CListBox *)GetDlgItem (IDC DEPT) pLB- Insertstring(-1,"办公室") LB-> InsertString(-1,"开发部"); pLB-> InsertString(-1,“生产部") pLB-> Insertstring(-1,"销售部"); pLB-> Insertstring(-1,"人事部"); return CDialog: OnInitDialogo 其中 GetDlgltem()为对话框类的成员函数,用于取对话框控件的指针。 为项日添加有关自定义的职工类 EMployee.选择 Developer Studio菜单的 Insert/New Cas选项,调出 New Class对话框。在 Class Type组合框中选择 Generic(普通类),填 写类名 EMployee,在对话框下方的 Base class(es)框中输入基类 CObject 在 Workspace窗口的 Class view中选择生成的 EMployee类的定义,添加代码 class CEmp public cob ject DECLARE SERIAL ( CEmployee) public string m strName //姓名 int m ns //性别 COleDateTime m bIrthdate;//出生日期 BOOL m mArried //婚否 CString m strDept //工作部门 string m strPosition;//职务 float m fsalary: //工资 EMployee(仆} CEmployee& operator =(CEmployee& e); virtual EMployee o virtual void Serialize(CArchive &ar EMployee类的对象即为一个职工的档案,我们用序列化实现文档的存取,所以要为 EMployee类编写序列化代码。这包括 DECLARE SERIAL()宏和 IMPLEMENT SERIAL ()宏(在 EMployee类的源代码文件中),一个没有参数的构造函数,重载的赋值运算 符和 Serialize()成员函数。在 EMployee类的源代码文件中添加以下代码 IMPLEMENT SERIAL ( CEmployee, COb ject, 1) //重载的赋值运算符 CEmployee& CEmployee: operator =(CEmployee& e)
第 15 单元 控件 310 CListBox *pLB = (CListBox *)GetDlgItem(IDC_DEPT); pLB->InsertString(-1, "办公室"); pLB->InsertString(-1, "开发部"); pLB->InsertString(-1, "生产部"); pLB->InsertString(-1, "销售部"); pLB->InsertString(-1, "人事部"); return CDialog::OnInitDialog(); } 其中 GetDlgItem()为对话框类的成员函数,用于取对话框控件的指针。 为项目添加有关自定义的职工类 CEmployee。选择 Developer Studio 菜单的 Insert/New Class…选项,调出 New Class 对话框。在 Class Type 组合框中选择 Generic(普通类),填 写类名 CEmployee,在对话框下方的 Base class (es)框中输入基类 CObject。 在 Workspace 窗口的 Class View 中选择生成的 CEmployee 类的定义,添加代码: class CEmployee : public CObject { DECLARE_SERIAL(CEmployee) public: CString m_strName; // 姓名 int m_nSex; // 性别 COleDateTime m_tBirthdate; // 出生日期 BOOL m_bMarried; // 婚否 CString m_strDept; // 工作部门 CString m_strPosition; // 职务 float m_fSalary; // 工资 CEmployee(){} CEmployee& operator = (CEmployee& e); virtual ~CEmployee(); virtual void Serialize(CArchive &ar); }; CEmployee 类的对象即为一个职工的档案,我们用序列化实现文档的存取,所以要为 CEmployee 类编写序列化代码。这包括 DECLARE_SERIAL()宏和 IMPLEMENT_SERIAL ()宏(在 CEmployee 类的源代码文件中),一个没有参数的构造函数,重载的赋值运算 符和 Serialize()成员函数。在 CEmployee 类的源代码文件中添加以下代码: IMPLEMENT_SERIAL(CEmployee, CObject, 1) // 重载的赋值运算符 CEmployee& CEmployee::operator = (CEmployee& e) {