第2章Windows应用程序的类封装本章主要内容:模仿MFC用C++类对Windows主函数进行封装应用程序类CWinApp及其派生类窗口类CFrameWnd及其派生类CCmdTarget类MFC消息映射回顾:Windows应用程序结构至少包含两个函数WinMain():必有且仅有一个窗口函数:每个窗口对应一个窗口函数,以响应该窗口的消息WinMain()函数需完成的功能定义窗口类注册窗口类建立窗口类的窗口显示窗口运行消息循环2.1应用程序主函数的C++类封装窗口类CFrameWnd应用程序类CWinApp定义、注册窗口类RegisterWindow建立窗口类的窗口Create显示窗口ShowWindow创建窗口对象InitInstance消息循环Run主函数WinMain利用theApp对象为了在主函数中使用应用程序类的对象,在主函数前定义应用程序类的全局对象2.1应用程序主函数的C++类封装窗口类:classCFrameWnd{public:HWNDhWnd;public:intRegisterWindow();voidCreate(LPCTSTRlpClassName,LPCTSTRlpWindowName);voidShowWindow(intnCmdShow);voidUpdateWindow();};数据成员创建窗口定义及注册窗口类显示与更新窗口2.1应用程序主函数的C++类封装应用程序类:classCWinApp{public:CFrameWnd*m_pMainWnd;public:BOOLInitInstance(intnCmdShow);intRun();};以窗口类的对象作为数据成员在初始化函数中创建及显示窗口消息循环2.2派生类的应用灵活性差,如改变窗口标题利用C++类的继承性和多态性,程序员可以在已有的类的基础上派生自己的类。这样,程序员就可以在派生类中添加自己需要的成员,同时也可以对基类的函数进行重新定义(重写),以满足不同应用程序的需要。窗口类CFrameWnd应用程序类CWinApp主函数WinMain系统提供向导生成2.2.1应用程序类的派生类获得应用程序对象指针函数AfxGetApp()注意:在CWinApp的构造函数主函数CWinAppCMyApp1、把InitInstance声明为虚函数,实现多态2、增加指向应用程序类的对象的指针//应用程序类classCWinApp{public:CWinApp*m_pCurrentWinApp;public:CWinApp();public:CFrameWnd*m_pMainWnd;public:virtualBOOLInitInstance(intnCmdShow);intRun();};//由CWinApp类派生CMyApp类classCMyApp:publicCWinApp{public:BOOLInitInstance(intnCmdShow);//重新定义InitInstance函数};2.3窗口函数的封装——消息映射Windows系统是一个事件驱动、消息循环的操作系统,消息是应用程序与操作系统交互的手段。消息的产生来源于系统事件和用户事件。消息处理是Windows应用程序的核心。回顾:消息结构在Windows中,用一个结构类型表示消息的常量值和与该消息相关的其他信息,它的具体定义如下:typedefstructtagMSG{//消息结构HWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;DWORDtime;POINTpt;}MSG;2.3.1消息处理函数的简单封装intAPIENTRYWinMain(){……ReturnResultCode=pApp-Run();}Windows系统消息LRESULTCALLBACKWndProc(){调用AfxWndProc();AfxWndProc(){原窗口函数代码;}封装窗口函数的类CCmdTarget主函数事件2.3.2消息映射类消息处理函数afx_msgvoid消息处理函数名();类的消息映射表structAFX_MSGMAP_ENTRY{UINTnMessage;//Windows消息UINTnCode;UINTnID;UINTnLastID;UINTnSig;AFX_PMSGpfn;//消息函数指针};把每个类的消息映射表用链表连接,形成消息映射总表。指向本类消息映射表指向基类节点用DECLARE_MESSAGE_MAP来声明消息映射表用BEGIN_MESSAGE_MAP来定义链表节点和填写链表节点中数据,格式如下:BEGIN_MESSAGE_MAP(类名称,基类名称)用END_MESSAGE_MAP来表示消息映射函数表的结束2.3.3消息映射表的声明和实现补充:命名规则函数命名规则函数名=动词+名词动词和名词的第一个字母必须大写例GetMessage变量命名规则----匈牙利标记法:在每个变量名之前,用一个或多个小写字母标识变量类型。同时成员变量以m_开头。小写字母前缀表示变量的类型,其余的部分描述变量的功能。如m_strWndClass,m_表示这是个类数据成员,str表示这是类型为CString类的变量。又如:nCount命名规则—示例数据类型定义Win32变量名BOOLint32位符号数bOkINTint32位符号数nCountUINTunsignedint32位无符号数uMsgLONGlong32位符号数lTotalSizeAfx函数Afx是ApplicationFramework的简写,以Afx开头的函数都是全局函数,可以在任一个类实现中调用。典型的如AfxMessageBox()、AfxGetApp()等。上机P35例2-3写报告P47例2-5作业:P481、2、3、4