C++ MFC原理与方法new

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

发送消息到一个窗口可以采用传送(Send)或寄送 (Post)方式,这两种方式之间的主要区别是消息 被接收对象收到后是否立即被处理。Windows提供 了三个API函数用于消息的发送。

函数SendMessage()用于向一个或多个窗口传送消息, 该函数将调用目标窗口的窗口函数,直到目标窗口 处理完收到的消息,该函数才返回。

先定义一个句柄,然后调用MFC类的成员函数Attach()将 句柄与一个MFC类对象联系在一起,此时的句柄就成为 该MFC类对象的句柄。在退出对象作用域之前,调用成 员函数Detach()将句柄和对象进行分离。如下所示:
CWnd myWnd; HWND hWnd; myWnd.Attach(hWnd); . . . . . . myWnd.Detach();
本章主要学习内容:

Windows的编程机制 MFC的基本原理和使用方法:
– MFC类
– MFC应用程序框架
– MFC消息管理 – MFC宏

常用的MFC类
7.1 Windows编程基础

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


命令(Command)消息:由菜单项、工具栏按钮、快捷 键等用户界面对象发出的WM_COMMAND消息。命令 消息与其它消息不同,它可被更广泛的的对象如文档、 文档模板、应用程序对象、窗口和视图等处理。
消息用MSG结构表示:
typedef struct tagMSG { HWND hWnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
// 目标窗口句柄 // 消息标识 // 消息参数1(附加信息,16位) // 消息参数2(附加信息,32位) // 消息发送时间 // 消息发送时鼠标的屏幕坐标
7.2
MFC微软基础类
Visual C++捆绑了微软的基础类MFC,编程时 我们就可以利用类的可重用性和可扩充性,大大降 低Windows应用程序设计的难度和工作量。
2.在窗口函数WndProc()的消息处理分支switch-case 结构中添加WM_LBUTTONDOWN鼠标单击消息及 其处理代码: case WM_LBUTTONDOWN:
MessageBox(NULL, "You pressed the
left button of mouse !","MHale Waihona Puke Baidussage",NULL);
7.2.1 MFC概述

MFC作为一个Windows编程类库,它包含了200多个类, 封装了Windows的大部分编程对象以及与它们有关的操 作。

虽然程序在功能上千差万别,但从本质上看,都可以分 为用户界面设计、文件操作、数据库访问及多媒体使用 等几部分。
7.2.2 MFC体系结构

MFC主要组成部分:类、宏和全局函数。
消息队列和在应用程序中的轮询处理
Windows消息分为三种类型:

标 准 Windows 消 息 : 以 WM_ 前 缀 ( 但 不 包 括 WM_COMMAND)开始的消息,包括鼠标消息、键盘 消息和窗口消息,如WM_MOVE 、WM_PAINT等。 控件通知(Control Notification)消息:对控件操作引起 的消息,是控件和子窗口向其父窗口发出的 WM_COMMAND通知消息。例如,当用户修改了编辑 控件中的文本后,编辑控件向其父窗口发送 WM_COMMAND通知消息。
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() // 声明使用消息映射宏 };


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

MFC消息管理
MFC消息管理是MFC编程的一个重要内容,也是编 写MFC应用程序的基础。 MFC应用程序消息处理的方式与SDK应用程序有所 不同。MFC应用程序框架截取了Windows向应用程 序发出的消息,再确定将消息发送给哪一个对象。 消息管理包括消息的发送和处理。对于消息发送, MFC提供了类似于API函数功能的消息发送函数, 而MFC消息处理的内部机制则相对复杂一些。从编 程的角度出发,我们只需了解其大致的原理。
break;
7.1.2 句柄
在Windows中,用句柄(Handle)标识应用程序
中不同的对象和同类对象中不同的实例,如一个 具体的窗口、按钮、输出设备、画笔和文件等。 通过句柄可以获得相应的对象信息。常用的句柄 类型有: HWND 、 HINSTANCE 、 HDC 、 HCURSOR、HICON、HMENU等。

例:编写一个名为Hello的类SDK应用程序,当单击 鼠标时通过调用API函数,以弹出一个提示信息对 话框。
1 . 执 行 “ File|New” 菜 单 命 令 , 在 New 对 话 框 的 Project页面中选择Win32 Application项目类型,输入 程序名 Hello。在向导第 1步选择 “A typital “Hello world!” application”项,单击Finish按钮。

函数PostMessage()用于向一个或多个窗口寄送消息, 它把消息放在指定窗口创建的线程的消息队列中, 然后不等消息处理完就返回。

函数SendDlgItemMessage()函数用于向对话框中指定 的控件发送消息,直到目标控件处理完收到的消息, 该函数才返回。
在类的实现源文件中用BEGIN_MESSAGE_MAP()
和END_MESSAGE_MAP()宏来定义消息映射。
在类定义的结尾用DECLARE_MESSAGE_MAP()
宏来声明使用消息映射。
MFC应用程序MESSAGE_MAP消息映射形式:
BEGIN_MESSAGE_MAP(theclass, baseclass) //{{AFX_MSG_MAP(theclass)

7.1.1 关于API和SDK

API(Application Programming Interface) 是 Windows操作系统与应用程序之间的标准接口,它 提供了上千个标准函数、宏和数据结构的定义。 SDK API软件开发包,利用Win32 Application向 导建立Windows应用程序框架,然后根据需要添加 头文件、实现源文件和资源文件,并编写具体的程 序代码。
先大体上了解MFC的概念、组成和基本约定,从简单的类 入手,结合程序设计,由浅入深,循序渐进、日积月累。 编程时如果MFC某个类能完成所需要的功能,可以直接调 用已有类的方法(成员函数)。否则,可以利用面向对象技 术中的“继承”方法对MFC类的行为进行扩充和修改,从 MFC中已有的类派生出自己需要的类。 学习MFC,另一点就是不要过分依赖于向导(Wizard)工 具。向导能做许多工作,但同时掩饰了太多的细节。

类是MFC中最主要的内容。MFC类是以层次结 构方式组织起来的。MFC中的类分成两部分, 除了一些辅助类,大多数的MFC类是直接或间 接从根类CObject派生而来。
几乎每一个派生层次都与一具体的Windows实例 相对应,如文档类、窗口类和视图类等。 MFC宏主要功能:消息映射、运行时对象类型 服务、诊断服务、异常处理。
句柄常作为Windows消息和API函数的参数,在
采用API方法编写Windows应用程序时要经常使 用句柄。而采用MFC方法编写Windows应用程序 时,由于对应的MFC类已对句柄进行了封装,大 多数情况下不再需要访问句柄。
获取MFC类对象的句柄的两种方法:

通过访问类的public属性成员变量,如类CWnd的成员变 量m_hWnd就是一个窗口对象的句柄。


MFC约定:全局函数以“Afx”为前缀,全局变 量以“afx”为前缀。
7.2.3 学习MFC的方法

首先要对Windows编程概念和API函数有一定的了解,如 Windows API有哪些功能和哪些常用的数据结构等。
学会抽象地把握问题,不求甚解,不要一开始学习Visual C++就试图了解整个MFC类库。从理解和使用两个方面学 习MFC,理解MFC应用程序的框架结构。
7.1.3 事件和消息

所谓消息就是用于描述某个事件发生的信息,而事件 是对于Windows的某种操作。 事件和消息密切相关,事件是因,消息是果,事件产 生消息,消息对应事件。所谓消息的响应,其实质就 是事件的响应。 消息驱动是Windows应用程序的核心,所有的外部响 应(如键盘、鼠标和计时器等)都被Windows先拦截, 转换成消息后再发送到应用程序中的目标对象,应用 程序根据消息的具体内容进行处理。 消息不仅可由Windows发出,它也可由应用程序本身 或其它程序产生。Windows为每一个应用程序都维护 一个或多个消息队列,发送到每个程序窗口的消息都 排成一个队列。
例 利用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()

7.4.1 MFC消息映射机制
MFC 采 用 消 息 映 射 ( Message
Map) 机 制 取 代 C/C++语言中的switch-case结构来处理消息。 映射宏把一个Windows消息和其消息处理函数联结 起来。
MFC消息映射机制包括一组消息映射宏。一条消息
MFC应用程序框架提供了消息映射功能。
相关文档
最新文档