《程序设计实践.ppt》由会员分享,可在线阅读,更多相关《程序设计实践.ppt(42页珍藏版)》请在优知文库上搜索。
1、程序设计实践程序设计实践第四章第四章 面向对象实用系统分析与设计面向对象实用系统分析与设计MFC程序设计知识小结程序设计知识小结nWindows程序设计基础程序设计基础nMFC程序框架中的主要类程序框架中的主要类CObject类:类:MFCMFC中大多数类的抽象基类,它提供序列化、中大多数类的抽象基类,它提供序列化、运行时信息,诊断和调试支持等。运行时信息,诊断和调试支持等。CWinappCWinapp类:类:代表应用程序的核心。代表应用程序的核心。CDocumentCDocument类:类:文档类,用于组织用户数据。文档类,用于组织用户数据。CWndCWnd类类: 图形用户界面对象的基类。图
2、形用户界面对象的基类。CMainFrameCMainFrame类:类:应用程序主窗口类。应用程序主窗口类。CChildFrameCChildFrame类:类: 应用程序子窗口类。应用程序子窗口类。CViewCView类:类:视图类,用于显示和操作文档中的数据。视图类,用于显示和操作文档中的数据。CTemplateDocCTemplateDoc类:文档模版基类。类:文档模版基类。CMultiTemplateDocCMultiTemplateDoc和和CSingleTemplateDocCSingleTemplateDoc类。类。nMFC程序运行机制程序运行机制 MFC程序的初始化过程程序的初始化
3、过程动态类型识别动态类型识别 RTTI (Runtime Type Identification)动态生成动态生成 (Dynamic Creation)永久保存永久保存 (Persistence)信息映射信息映射 (Message Mapping)命令传递命令传递 (Command Routing)第四章第四章 面向对象实用系统分析与设计面向对象实用系统分析与设计定义全局变量定义全局变量theApp 重载成员函数重载成员函数InitialInstance()重载重载CObject类成员函数类成员函数BOOL IsKindOf(CRunTimeClass *)重载重载CObject类成员函数类成
4、员函数CObject * CreateObject(void)实现成员函数实现成员函数void Serialize (CArchive & ar)使用消息映射表替代窗口函数,使用消息映射表替代窗口函数,降低程序设计的难度。降低程序设计的难度。WM_COMMAND消息传递机制消息传递机制MFC应用程序常用的宏应用程序常用的宏第四章第四章 面向对象实用系统分析与设计面向对象实用系统分析与设计消息映射消息映射DECLARE_MESSAGE_MAP BEGIN_MESSAGE_MAP ON 消息名消息名(参数(参数)END_MESSAGE_MAP动态生成动态生成DECLARE_DYNCREATE IM
5、PLEMENT_DYNCREATE 动态类型识别动态类型识别DECLARE_DYNAMIC IMPLEMENT_DYNAMIC序列化序列化DECLARE_SERIAL IMPLEMENT_SERIAL支持支持 RUNTIMECLASS 机制机制重载重载IsKindOf() 方法方法支持动态类型识别支持动态类型识别重载重载CreateObject () 方法方法支持动态类型识别支持动态类型识别 支持动态生成支持动态生成 重载重载Serialize () 方法方法支持支持信息映射信息映射 支持动态生成支持动态生成 支持支持Serialize () 方法方法nMFC应用程序类型应用程序类型(1) (
6、1) 基于对话框的应用程序基于对话框的应用程序 (2) SDI(2) SDI应用程序应用程序 (3) MDI(3) MDI应用程序应用程序(4) (4) 非文档视图结构程序非文档视图结构程序第四章第四章 面向对象实用系统分析与设计面向对象实用系统分析与设计对话框界面设计、成员变对话框界面设计、成员变量、消息映射。量、消息映射。文档文档/视结构、用户界面视结构、用户界面资源、文本和图形输出、资源、文本和图形输出、序列化文档保存。序列化文档保存。文档文档/视结构、多文档、多视结构、多文档、多视图等视图等对话框的应用程序对话框的应用程序 或或以以SDISDI和和MDIMDI为基础,不使为基础,不使用
7、文档用文档/ /视结构。视结构。第四章第四章 面向对象实用系统分析与设计面向对象实用系统分析与设计 使用面向对象技术设计并实现一个题目为使用面向对象技术设计并实现一个题目为汽车客运汽车客运公司售票系统公司售票系统小型管理信息系统案例。小型管理信息系统案例。本章内容提要: n需求分析需求分析n系统功能结构设计系统功能结构设计n系统中各系统中各MFCMFC类的设计和实现类的设计和实现n主要算法主要算法n界面设计界面设计n案例分析案例分析4.1 4.1 项目需求项目需求项目名称项目名称:汽车客运公司售票系统汽车客运公司售票系统业务需求业务需求: 某客运公司每日向某客运公司每日向10个城市发一个直达班
8、车个城市发一个直达班车(中途不停车中途不停车)。每天都发售今明后。每天都发售今明后3天的客票。天的客票。n功能需求:功能需求:1 数据存储需求数据存储需求 该系统需要磁盘上存储以下信息:该系统需要磁盘上存储以下信息:(1)今、明、后今、明、后3天每个班次的基本信息,天每个班次的基本信息,包括:每个班次的班次号、发车时间、终点城市,票价包括:每个班次的班次号、发车时间、终点城市,票价和座位数量;和座位数量;(2)已发售每个班次的旅客登记表,包括:已发售每个班次的旅客登记表,包括:身份证号、姓名、座号。身份证号、姓名、座号。2 主要功能主要功能l创建存储一天的每个班次的基本信息的存储系统。创建存储
9、一天的每个班次的基本信息的存储系统。l创建每个班次的旅客登记表。创建每个班次的旅客登记表。l办理售票(座号不能重复)办理售票(座号不能重复)l办理退票(删除旅客信息)办理退票(删除旅客信息)l查询指定班次的剩余票数和座位号查询指定班次的剩余票数和座位号l输出指定班次的旅客登记表输出指定班次的旅客登记表4.1 4.1 项目需求项目需求4.2 4.2 详细设计方案详细设计方案1 系统总体设计方案:使用系统总体设计方案:使用MFC中中SDI程序框架。程序框架。MFC SDI程序框架框架类的派生类4.2.1 实体类设计实体类设计1 班次类设计班次类设计;class CBusInfo : public
10、CObject DECLARE_SERIAL(CBusInfo);private: CString m_strBusID; CTime m_StartTime; /班次号、发车时间班次号、发车时间 CString m_Destination; /终点城市、终点城市、 int m_nSeat; m_nSeatSaled; /座位数量、已售数量座位数量、已售数量 float m_fPrice; /票价票价public: CBusInfo(); CBusInfo(CString strBusID, CTime StartTime,CString Destination, int nSeat, int
11、 nSeatSaled, float fPrice); CBusInfo(CBusInfo & obj); virtual CBusInfo(); void Serialize(CArchive& ar);4.2 4.2 详细设计方案详细设计方案班次类数据成员班次类数据成员序列化定义宏序列化定义宏CObject类类默认构造函数默认构造函数构造、析构函数构造、析构函数序列化函数序列化函数2 2 班次类的实现班次类的实现IMPLEMENT_SERIAL(CBusInfo,CObject,1); CBusInfo:CBusInfo() /默认构造函数默认构造函数 CBusInfo:CBusInfo(
12、CString strBusID,CTime StartTime,CString Destination,int nSeat,int nSeatSaled,float fPrice) /构造函数,用于创建对象。构造函数,用于创建对象。m_strBusID = strBusID;m_StartTime = StartTime;m_Destination = Destination;m_nSeat = nSeat;m_nSeatSaled = nSeatSaled; m_fPrice = fPrice;序列化实现宏序列化实现宏2 2 班次类的实现班次类的实现void CBusInfo:Serial
13、ize(CArchive& ar) CObject:Serialize( ar); if (ar.IsStoring() arm_strBusIDm_StartTimem_Destination m_nSeat m_nSeatSaledm_strBusIDm_StartTimem_Destinationm_nSeat m_nSeatSaledm_fPrice; 序列化函数序列化函数序列化基类序列化基类CObject类类保存数据保存数据读入数据读入数据class CTraveler : public CObject DECLARE_SERIAL(CTraveler);public:CTravel
14、er();CTraveler( CString strBusID,CString TravelID,CString strName, CTime dDateTime, int nSeat);CTraveler(CTraveler & obj);virtual CTraveler();virtual void Serialize(CArchive& ar);public: CString m_strBusID;/班次号班次号 CString m_TravelID;/身份证号身份证号 CString m_Name;/姓名姓名 CTime m_DateTime;/购票日期购票日期 int m_nSe
15、at;/座位号座位号 CBusInfo *m_pBusInfo;/班次指针班次指针;3 3 旅客类设计旅客类设计 班次对象地址,用于班次对象地址,用于表示旅客与车次之间的表示旅客与车次之间的关系(车票)。关系(车票)。IMPLEMENT_SERIAL(CTraveler,CObject,1);CTraveler:CTraveler()CTraveler:CTraveler( CString strBusID,CString TravelID,CString Name,CTime DateTime,int nSeat,CBusInfo* pBusInf) m_strBusID=strBusID;
16、/班次号班次号 m_TravelID=TravelID;/身份证号身份证号 m_Name =Name ; /姓名姓名 m_DateTime=DateTime; /购票日期购票日期 m_nSeat =nSeat ;/座位号座位号 m_pBusInfo =pBusInfo;4 4 旅客类的实现旅客类的实现 void CTraveler:Serialize(CArchive& ar)CObject:Serialize( ar);if (ar.IsStoring() arm_strBusIDm_TravelIDm_DateTime m_Namem_strBusIDm_TravelIDm_DateTime m_Namem_nSeat;4 4 旅客类的实现旅客类的实现 限制(限制(ConstrainConstrain):):CTravelerCTraveler类中数据成员类中数据成员CBusInfo CBusInfo * *m_pBusInfom_pBusInfo是是一个指向一个指向CBusInfoCBusInfo类型对象的内存地址,将其数值类型对象的内存地址,将其数值写入磁盘文件是毫无意义的。这