1 / 60

第六章 MFC 原理与方法

面向对象程序设计. 第六章 MFC 原理与方法. MFC (Microsoft Foundation Class) 微软基础类 是一个由 Microsoft 公司设计的类库。 MFC 框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员要做的就是通过接口把具体应用程序特有的东西填入这个轮廓。 MFC 的目的是让应用程序员在应用程序框架的基础上建立 Windows 下的应用程序,这种方法相对于 SDK 来说更为简单。 采用 MFC 方式编程提高了 Windows 应用程序的开发效率。 认识 MFC 只是一个过程、一个手段,最终目的是为了良好并熟练地运用 MFC。.

chanda-kim
Download Presentation

第六章 MFC 原理与方法

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 面向对象程序设计 第六章 MFC原理与方法

  2. MFC(Microsoft Foundation Class)微软基础类是一个由Microsoft公司设计的类库。 • MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员要做的就是通过接口把具体应用程序特有的东西填入这个轮廓。 • MFC的目的是让应用程序员在应用程序框架的基础上建立Windows下的应用程序,这种方法相对于SDK来说更为简单。 • 采用MFC方式编程提高了Windows应用程序的开发效率。 • 认识MFC只是一个过程、一个手段,最终目的是为了良好并熟练地运用MFC。

  3. 本章内容 • Windows的编程机制 • MFC的基本原理和使用方法 • MFC类 • MFC应用程序框架 • MFC消息管理 • MFC宏 • 常用的MFC类

  4. Windows编程机制 • Windows是一个多进程的图形窗口操作系统,Windows应用程序与DOS应用程序有很大的区别: • DOS应用程序采用顺序执行过程, • Windows是一个基于事件的消息(Message)驱动系统。 • Windows应用程序是按照“事件→消息→处理”非顺序的机制运行。 • 当有某个事件(如单击鼠标、键盘输入和执行菜单命令等)发生时,Windows会根据具体的事件产生对应的消息,并发送到指定应用程序的消息队列; • 应用程序从消息队列中取出消息,并根据不同的消息进行不同的处理。

  5. 什么是Windows API? • Windows是个多作业系统,除了协调应用程序的执行、分配内存、管理系统资源等之外,它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的。由于这些函数服务的对象是应用程序(Application),所以便称之为Application Programming Interface,简称API 函数。 • Windows API是微软对于Windows操作系统中可用的内核应用程序编程接口的称法。它也是应用软件与Windows系统最直接的交互方式。

  6. 关于Windows API • Windows API是Windows操作系统与应用程序之间的标准接口,它提供了上千个标准函数、宏和数据结构的定义。 • 凡是在 Windows 工作环境底下执行的应用程序,都可以调用Windows API。Windows应用程序可通过调用标准Windows API函数使用系统提供的功能。 • Windows API函数定义在一些DLL动态链接库中,其中最主要的DLL是User32.dll、Gdi32.dll和Kernel32.dll三个库文件。

  7. 如何对待Windows API • 我们对待API函数不必刻意去研究每一个函数的用法,那也是不现实的(能用得到的API函数有几千个呢)。 • 不要去学,在需要的时候去查API帮助就足够了。

  8. 关于Windows SDK • SDK即software develope kit(软件开发工具包),它包含了进行Windows软件开发的文档和API函数的输入库、头文件(因为API在动态链接库中,这些动态链接库是系统的组成部分因此不用再提供,而输入库和头文件则必须,这样才能在你的程序中使用API函数)。 • 早期SDK是一个单独发放的包,现在在Visual C++和其他一些开发环境中已经包含了它。如果已经安装了VC++,那么就可以开始编写Windows程序了。随着Windows系统的发展,SDK的内容越来越多,我们只要抓住最基本的方面。

  9. 学SDK很重要的是:不要期望在开始时把每行代码都搞清楚。 • 使用VC++未必是编写SDK程序,编写SDK程序也未必要用VC++。 • 编写Windows程序的方法也不止SDK一种,还包括使用类库如MFC,OWL(Object   Window   Library, Borland   C++ 的类库),使用快速开发工具如VB,Delphi。这些方法各有各的用处。 • 使用SDK是最麻烦的,我们学习SDK也并非是为了用它来编软件(虽然它可以),主要是为了对Windows编程有比较清晰的认识,从而帮助你认识和使用MFC。

  10. 利用Visual C++编写一个类SDK应用程序: • 利用Win32 Application向导建立一个Windows应用程序框架; • 根据需要可以向程序项目中添加一些头文件、实现源文件和资源文件; • 编写具体的程序代码。

  11. 例1编写一个名为Hello的类SDK应用程序,当单击鼠标时通过调用API函数,以弹出一个提示信息对话框。例1编写一个名为Hello的类SDK应用程序,当单击鼠标时通过调用API函数,以弹出一个提示信息对话框。 1.执行“File|New”菜单命令,在New对话框的Project页面中选择Win32 Application项目类型,输入程序名Hello。在向导第1步选择 “A typital “Hello world!” application”项,单击Finish按钮。 2.在窗口函数WndProc()的消息处理分支switch-case结构中添加WM_LBUTTONDOWN鼠标单击消息及其处理代码: case WM_LBUTTONDOWN: MessageBox(NULL, "You pressed the left button of mouse !","Message",NULL); break;

  12. 开始执行 初始化应用 初始化和创建应用窗口 进入消息循环并从消息队列得到一个消息 程序是否定义了对此消息的处理 否 处理消息 是 终止执行 进行默认处理 Windows程序的基本结构 当前消息是否“退出”?

  13. SDK应用程序结构 • 一个由API函数构造的Windows程序的功能由三个部分组成:入口函数、窗口函数和Windows系统。 • Windows程序以窗口的形式存在,在不同窗口之间传递消息是Windows和应用程序进行交流的主要形式。程序具体功能由不同的窗口函数实现。

  14. WinMain()函数是Windows程序的入口主函数,它定义了窗口类,进行消息循环。消息循环就是那个普通的while循环,在其中接收消息、分发消息。当消息循环结束后,就退出了WinMain()函数,也就退出了应用程序。该函数的主要任务:WinMain()函数是Windows程序的入口主函数,它定义了窗口类,进行消息循环。消息循环就是那个普通的while循环,在其中接收消息、分发消息。当消息循环结束后,就退出了WinMain()函数,也就退出了应用程序。该函数的主要任务: • 初始化应用 • 初始化和创建应用窗口 • 进入应用程序的消息循环 • 窗口函数WndProc,名字可以自己定。在其中用一个大的switch结构检索消息,在每个case下面写处理消息的代码。 • 执行窗口的消息处理: • 分析消息信息,决定应用程序如何处理消息或响应一个事件。

  15. 句 柄 • Windows程序中产生的任何资源(要占用某一块或大或小的内存),如图标,光标,窗口,应用程序的实例(已加载到内存运行中的程序)等等,操作系统每产生一个这样的资源时,都要将它们放入相应的内存,并为这些内存指定一个唯一的标识号,这个标识号即该资源的句柄。 • 操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源的。 • 按资源的类型,可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。 • 句柄常作为Windows消息和API函数的参数,在采用API方法编写Windows应用程序时要经常使用句柄。而采用MFC方法编写Windows应用程序时,由于对应的MFC类已对句柄进行了封装,大多数情况下不再需要访问句柄。

  16. 获取MFC类对象的句柄的两种方法 • 通过访问类的public属性成员变量,如类CWnd的成员变量m_hWnd就是一个窗口对象的句柄。 • 先定义一个句柄,然后调用MFC类的成员函数Attach()将句柄与一个MFC类对象联系在一起,此时的句柄就成为该MFC类对象的句柄。在退出对象作用域之前,调用成员函数Detach()将句柄和对象进行分离。如下所示: CWnd myWnd; HWND hWnd; myWnd.Attach(hWnd); . . . . . . myWnd.Detach();

  17. 事件和消息 • 事件是一个动作——用户触发的动作。事件只能由用户通过外设的输入产生。 • 消息是一个信息——传递给系统的信息。产生消息的来源有三个: • 由操作系统产生。 • 由用户触发的事件转换而来。 • 由另一个消息产生。 • 事件与消息的本质不同:事件由用户(操作电脑的人)触发且只能由用户触发,操作系统能够感觉到由用户触发的事件,并将此事件转换为一个(特定的)消息发送到程序的消息队列中。强调:可以说“用户触发了一个事件”,而不能说“用户触发了一个消息”。

  18. 消息队列和在应用程序中的轮询处理

  19. Windows消息分为三种类型 • 标准Windows消息:以WM_前缀(但不包括WM_COMMAND)开始的消息,包括鼠标消息、键盘消息和窗口消息,如WM_MOVE 、WM_PAINT等。 • 控件通知(Control Notification)消息:对控件操作引起的消息,是控件和子窗口向其父窗口发出的WM_COMMAND通知消息。例如,当用户修改了编辑控件中的文本后,编辑控件向其父窗口发送WM_COMMAND通知消息。 • 命令(Command)消息:由菜单项、工具栏按钮、快捷键等用户界面对象发出的WM_COMMAND消息。命令消息与其它消息不同,它可被更广泛的的对象如文档、文档模板、应用程序对象、窗口和视图等处理。

  20. 消息用MSG结构表示: typedef struct tagMSG { HWND hWnd; // 目标窗口句柄 UINT message; // 消息标识 WPARAM wParam; // 消息参数1(附加信息,16位) LPARAM lParam; // 消息参数2(附加信息,32位) DWORD time; // 消息发送时间 POINT pt; // 消息发送时鼠标的屏幕坐标 } MSG;

  21. 例2 为程序Hello添加键盘消息处理功能,判断当前按下的键是不是A或a键,并给出相应的提示。 打开程序项目Hello,在文件Hello.cpp的窗口函数WndProc()的switch消息处理分支中添加键盘消息的处理代码: case WM_KEYDOWN: // 处理键盘消息 if(wParam==0x41) // A或a键的虚键码为0x41H MessageBox(NULL, "The key you pressed is A or a !","KEYDOWN",NULL); else MessageBox(NULL, "The key you pressed is not A or a !","KEYDOWN",NULL); break;

  22. MFC微软基础类 利用Windows API开发程序的用户有这样的体会,即使开发一个简单的Windows应用程序也需要对Windows的编程原理有很深刻的认识,需要手工编写冗长的代码。由于程序的出错率是随着代码长度的增加呈几何级数增长的,而且当程序长度逐渐膨胀时,调试程序会变得越来越困难。因此,传统的Windows应用程序设计需要程序员有极大的耐心和丰富的编程经验。 Visual C++捆绑了微软的基础类MFC,编程时我们就可以利用类的可重用性和可扩充性,大大降低Windows应用程序设计的难度和工作量。

  23. MFC概述 • 类库是一个可以在应用程序中使用的相互关联的C++类的集合。MFC作为一个Windows编程类库,它包含了200多个类,封装了Windows的大部分编程对象以及与它们有关的操作。 • MFC库——Microsoft 基本类库是一个Windows应用程序框架,它定义了应用程序的结构,并实现了标准的用户接口: • 管理窗口、菜单、对话框,实现基本的输入/输出和数据存储。 • MFC实际上是一个庞大的文件库,它由几百个执行文件和源代码文件(如H文件)组成。

  24. 采用MFC编程的优点 使用标准化的程序代码结构,有利于程序员之间的交流。 Visual C++为MFC提供了大量的工具支持,提高了编程效率。如利用MFC AppWizard创建MFC应用程序框架,利用ClassWizard方便地对Windows消息进行管理。 MFC应用程序的效率较高,只比传统的Windows C程序低5%左右。并且,在MFC应用程序中还允许混合使用传统的Windows API函数。 其它优势:完全支持Windows所有的函数、控件、消息、菜单及对话框;具有良好的稳定性和可移植性,更符合微软的风格等。

  25. MFC体系结构 MFC主要组成部分:类、宏和全局函数。 类是MFC中最主要的内容。MFC类是以层次结构方式组织起来的。MFC中的类分成两部分,除了一些辅助类,大多数的MFC类是直接或间接从根类CObject派生而来。 几乎每一个派生层次都与一具体的Windows实例相对应,如文档类、窗口类和视图类等。 MFC宏主要功能:消息映射、运行时对象类型服务、诊断服务、异常处理。 MFC约定:全局函数以“Afx”为前缀,全局变量以“afx”为前缀。

  26. 学习MFC的方法 首先要对Windows编程概念和API函数有一定的了解,如Windows API有哪些功能和哪些常用的数据结构等。 学会抽象地把握问题,不求甚解,不要一开始学习Visual C++就试图了解整个MFC类库。从理解和使用两个方面学习MFC,理解MFC应用程序的框架结构。 先大体上了解MFC的概念、组成和基本约定,从简单的类入手,结合程序设计,由浅入深,循序渐进、日积月累。 编程时如果MFC某个类能完成所需要的功能,可以直接调用已有类的方法(成员函数)。否则,可以利用面向对象技术中的“继承”方法对MFC类的行为进行扩充和修改,从MFC中已有的类派生出自己需要的类。 学习MFC,另一点就是不要过分依赖于向导(Wizard)工具。向导能做许多工作,但同时掩饰了太多的细节。

  27. MFC应用程序框架 MFC不仅仅是一个类库,它还提供了一层建立在MFC类对象封装上的附加应用程序框架。应用程序框架是为了生成一般的应用程序所必需的各种软组件的集成,是类库的一种超集。 类库只是一种可以嵌入到任何程序中的、提供某些特定功能的类的集合。而应用程序框架却定制了应用程序的结构和源代码,其中的类对象既相互独立、又相互作用,形成一个统一的整体。 应用程序对象theApp是一个唯一的全局变量,它的主要功能是通过调用WinMain()主函数启动程序的运行。 MFC应用程序框架也有一个作为程序入口点的WinMain()主函数,但在源程序中看不见该函数,它在MFC中已定义好并同应用程序相链接。

  28. 一个MDI应用程序的构成

  29. 应用程序是全局对象,在启动程序之前构造 应用程序创建文档模板 文档模板创建文档和边框窗口 边框窗口创建视 应用程序创建MFC对象的顺序

  30. MFC应用程序对象之间的关系

  31. MFC应用程序的生与死 在MFC应用程序的CWinApp派生类对象theApp是一个全局变量,代表了应用程序运行的主线程。它在程序整个运行期间都存在,它的销毁意味着运行程序的消亡。 MFC应用程序启动时,首先创建应用程序对象theApp,这时将自动调用应用程序类的构造函数初始化对象theApp,然后由应用程序框架调用MFC提供的AfxWinMain()主函数。 AfxWinMain()主函数首先通过调用全局函数AfxGetApp()获取应用程序对象theApp的指针pApp,然后通过pApp调用应用程序对象的有关成员函数,完成程序的初始化和启动工作,最后调用成员函数Run(),进入消息循环。 程序运行后将收到WM_PAINT消息,调用OnPaint()函数绘制客户区窗口。如果Run()收到WM_QUIT消息,则结束消息循环,然后调用函数ExitInstance(),结束程序运行。

  32. WinMain入口函数流程

  33. MFC应用程序运行后各函数的调用关系 InitInstance()函数是派生类唯一需要重载的函数,它负责应用程序的初始化,如初始化数据、创建文档模板、处理命令行以及显示应用程序主窗口。

  34. 文 件 名 称 说 明 afxwin.h 声明MFC核心类 afxext.h MFC扩展文件,声明工具栏、状态栏、拆分窗口等类 afxdisp.h 声明OLE类 afxdtctl.h 声明支持IE 4公用控件的MFC类,如CImageList等 afxcmn.h 声明Windows公共控件类 Mfc42.lib MFCxx.DLL的导入函数库(Release版) Mfc42D.lib MFCxx.DLL的导入函数库(Debug版) MfcS42.lib MFCSxx.DLL的导入函数库(Static Release版) MfcS42D.lib MFCSxxD.DLL的导入函数库(Static Debug版) Mfc42U.lib MFCxxU.DLL的导入函数库(Unicode Release版) 常用的MFC文件和库文件

  35. Mfc42UD.lib MFCxxUD.DLL的导入函数库(Unicode Debug版) MfcO42D.lib MFCOxxD.DLL的导入函数库(OLE Debug版) MfcD42D.lib MFCDxxD.DLL的导入函数库(Database Debug版) Nafxcw.lib MFC静态链接库(Release版) NafxcwD.lib MFC静态链接库(Debug版) gdi32.lib GDI32.DLL的导入函数库 user32.lib USER32.DLL的导入函数库 kernel32.lib KERNEL32.DLL的导入函数库 msvcrt.lib MSVCRT.DLL(C运行函数库)的导入函数库 msvcrtd.lib MSVCRTD.DLL(Debug版C运行函数库)的导入函数库 libcmt.lib C运行函数静态链接库(多线程) libc.lib C运行函数静态链接库(单线程)

  36. MFC消息管理 MFC消息管理是MFC编程的一个重要内容,也是编写MFC应用程序的基础。 MFC应用程序消息处理的方式与SDK应用程序有所不同。MFC应用程序框架截取了Windows向应用程序发出的消息,再确定将消息发送给哪一个对象,可以根据需要利用函数重载对消息进行处理,但不需要处理的消息将由应用程序框架自动处理。 消息管理包括消息的发送和处理。对于消息发送,MFC提供了类似于API函数功能的消息发送函数,而MFC消息处理的内部机制则相对复杂一些。从编程的角度出发,我们只需了解其大致的原理。

  37. MFC消息映射机制 • MFC采用消息映射(Message Map)机制取代C/C++语言中的switch-case结构来处理消息。 • MFC消息映射机制包括一组消息映射宏,一条消息映射宏把一个Windows消息和其消息处理函数联结起来。 • 在类定义的结尾用DECLARE_MESSAGE_MAP()宏来声明使用消息映射。 • 在类的实现源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏来定义消息映射。 • ON_COMMAND宏:消息映射宏的第一个参数为消息ID,第二个参数为消息处理函数。 如ON_COMMAND(ID_FILE_NEW,CWinApp::OnFile New)。 • MFC 使用ClassWizard帮助实现消息映射功能。

  38. 例子: • 在 AppWizard产生的应用程序类的源码中,应用程序类的定义(头文件)包含了类似如下的代码: //{{AFX_MSG(CTttApp) afx_msg void OnAppAbout(); //}}AFX_MSG DECLARE_MESSAGE_MAP() • 应用程序类的实现文件中包含了类似如下的代码: BEGIN_MESSAGE_MAP(CTApp, CWinApp) //{{AFX_MSG_MAP(CTttApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) //}}AFX_MSG_MAP END_MESSAGE_MAP() • 头文件里是消息映射和消息处理函数的声明,实现文件里是消息映射的实现和消息处理函数的实现。它表示让应用程序对象处理命令消息 ID_APP_ABOUT,消息处理函数是OnAppAbout。

  39. MFC应用程序MESSAGE_MAP消息映射形式 注意:特殊注解“//{{AFX_MSG_MAP”是ClassWizard类向导用于维护消息映射宏的标记,用户不要删除注解轻易修改注解内的代码。 BEGIN_MESSAGE_MAP(theclass, baseclass) //{{AFX_MSG_MAP(theclass) ON_ . . . . . . // MFC预定义的消息映射宏 ON_MESSAGE(message , memberFxn) // 用户自定义的消息映射宏 . . . . . . //}}AFX_MSG_MAP END_MESSAGE_MAP()

  40. 利用ClassWizard为框架类添加消息WM_CLOSE、WM_DESTROY及菜单项“Edit|Copy”的消息处理函数,分析ClassWizard完成了哪些工作。 启动ClassWizard,添加要求的三个消息处理函数,ClassWizard将在类的实现文件中添加三个消息映射宏和消息处理函数。消息映射宏如下: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() // 由MFC AppWizard程序向导自动生成的消息映射 ON_WM_CLOSE() // 由ClassWizard类向导添加 ON_WM_DESTROY() ON_COMMAND(ID_EDIT_COPY, OnEditCopy) //}}AFX_MSG_MAP END_MESSAGE_MAP()

  41. ClassWizard在类的定义中声明了消息处理函数 class CMainFrame : CFrameWnd { public: CMainFrame(); protected: //{{AFX_MSG(CMainFrame) // 声明消息处理函数原形 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // 由程序向导自动生成 afx_msg void OnClose(); // 由ClassWizard类向导添加 afx_msg void OnDestroy(); afx_msg void OnEditCopy(); //}}AFX_MSG DECLARE_MESSAGE_MAP() // 声明使用消息映射宏 };

  42. 消息的发送 • 发送消息到一个窗口可以采用传送(Send)或寄送(Post)方式,这两种方式之间的主要区别是消息被接收对象收到后是否立即被处理。Windows提供了三个API函数用于消息的发送。 • 函数SendMessage()用于向一个或多个窗口传送消息,该函数将调用目标窗口的窗口函数,直到目标窗口处理完收到的消息,该函数才返回。 • 函数PostMessage()用于向一个或多个窗口寄送消息,它把消息放在指定窗口创建的线程的消息队列中,然后不等消息处理完就返回。 • 函数SendDlgItemMessage()函数用于向对话框中指定的控件发送消息,直到目标控件处理完收到的消息,该函数才返回。

  43. MFC将这三个函数封装为CWnd窗口类的成员函数,封装了目标窗口句柄,它们将向调用它的窗口对象发送或寄送消息,如pMyView->SendMessage()的调用形式表示向pMyView所指对象发送消息。MFC将这三个函数封装为CWnd窗口类的成员函数,封装了目标窗口句柄,它们将向调用它的窗口对象发送或寄送消息,如pMyView->SendMessage()的调用形式表示向pMyView所指对象发送消息。 与用户输入相关的消息(如鼠标消息和键盘消息)通常是以寄送(Post)的方式发送,以便这些用户输入可以由运行较缓慢的系统进行缓冲处理。而其它消息通常是以传送(Send)的方式发送

  44. 手工处理消息映射 创建自己的消息映射的具体过程: • 定义自己的消息ID:MFC允许用户自定义消息,常量WM_USER(为0x0400)与第一个自定义消息值相对应,用户必须为自己的消息定义相对于WM_USER的偏移值。利用#define语句定义自己的消息,例如: #define WM_USER1 WM_USER+0 #define WM_USER2 WM_USER+1

  45. 定义消息映射:在BEGIN_MESSAGE_MAP()之后,END_MESSAGE_MAP()之前加入消息映射语句:定义消息映射:在BEGIN_MESSAGE_MAP()之后,END_MESSAGE_MAP()之前加入消息映射语句: ON_MESSAGE(message, memberFxn) 其中,message是消息名标识,memberFxn是对应的消息处理函数。 • 在适当的地方定义消息处理函数,对消息进行响应: 自定义消息处理函数的声明:必须在函数返回类型前面加上afx_msg标识,如: afx_msg LRESULT memberFxn (WPARAM wParam , LPARAM lParam); 其中,参数wParam、lParam用于传递消息的两个附加信息。 • 在需要发送消息的地方发送消息:可用CWnd::SendMessage()函数或CWnd::PostMessage()函数发送消息。

  46. 编写一个自定义消息应用程序,程序启动后设置一个定时器,在WM_TIMER的消息处理函数中发送一个用户自定义消息,在对应的自定义消息处理函数中以动画的形式旋转显示一行文本。 1.首先利用MFC AppWizard[exe]向导创建一个名为Rotate的应用程序。利用ClassWizard类向导为CRotateView类生成消息WM_CREATE的消息处理函数,通过设置定时器在指定的时间间隔向窗口发送WM_TIMER消息。 SetTimer(1,200,NULL); // 启动定时器 2.在文件RotateView.cpp开始位置定义一个用户自定义消息: #define WM_MYMESSAGE WM_USER+1 利用ClassWizard为CRotateView类生成消息WM_TIME的消息处理函数:SendMessage(WM_MYMESSAGE);

  47. 3.在类CRotateView的定义中声明自定义消息处理函数:3.在类CRotateView的定义中声明自定义消息处理函数: afx_msg LRESULT OnMyMessage( WPARAM wParam, LPARAM lParam); 在文件RotateView.cpp消息映射BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP之间添加自定义消息映射宏: ON_MESSAGE(WM_MYMESSAGE,OnMyMyessage) 4.在类CRotateView的定义中声明一个private属性、int型的成员变量m_dEscapement,它表示文本显示角度,并在类CRotateView的构造函数中初始化:m_dEscapement=0; 5.在文件RotateView.cpp中手工添加自定义消息处理函数实现代码,完成以动画形式旋转显示一行文本的功能。 6.利用ClassWizard生成消息WM_DESTROY的消息处理函数,在销毁已创建的定时器:KillTimer(1);

  48. MFC宏 • 宏就是用预处理指令#define定义一个标识符,用它来表示一个字符串或一段源代码。 • MFC宏作为MFC类库的一个组成部分在MFC应用程序中经常出现。MFC宏在Afxwin.h、Afx.h及Afxmsg_.h等MFC头文件中分别进行了定义。 • MFC提供的宏有很多,常用的包括消息映射宏、运行时类型识别的宏、调试宏和异常宏等。

  49. 部分MFC类层次

More Related