消息映射及mfc入门

上传人:wt****50 文档编号:33012797 上传时间:2018-02-13 格式:DOC 页数:9 大小:248.50KB
返回 下载 相关 举报
消息映射及mfc入门_第1页
第1页 / 共9页
消息映射及mfc入门_第2页
第2页 / 共9页
消息映射及mfc入门_第3页
第3页 / 共9页
消息映射及mfc入门_第4页
第4页 / 共9页
消息映射及mfc入门_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《消息映射及mfc入门》由会员分享,可在线阅读,更多相关《消息映射及mfc入门(9页珍藏版)》请在金锄头文库上搜索。

1、MFC 消息映射及 MFC 入门一、MFC 消息映射机制在前面 Win32Class 工程中,我们进行了 Win32 环境下的“消息映射” 。其实,通过前面的过程,我们已经不知不觉的接触到了 MFC 消息映射的核心。MFC 环境下的消息映射,其原理和我们讲解过的 Win32 下的消息映射是类似的。简单地讲,就是让程序员指定要某个 MFC 类(有消息处理能力的类)处理某个消息。 MFC提供了工具 ClassWizard 来帮助实现消息映射,在处理消息的类中添加一些有关消息映射的内容和处理消息的成员函数。程序员负责编写消息处理函数的代码,实现所希望的功能。可以通过如下的 3 个重要的宏来实现 MF

2、C 消息映射,这些宏功能强大,其实现相对也比较复杂。这里只要求我们会用就可以。稍后我们会用其实际代码替换这些宏,就能理解了。 DECLARE_MESSAGE_MAP:初始化消息映射表,实际上是给所在类添加几个用于消息处理的静态成员变量和静态或虚拟函数。 BEGIN_MESSAE_MAP:开始消息映射。 END_MESSAE_MAP:结束消息映射。其他常见的、用于实现 MFC 消息的宏还有: 前缀为“ON_WM_”的宏: 用于 Windows 消息的宏(不带参数)如:ON_WM_PAINT()把消息 WM_PAINT 映射到 OnPaint 函数。 ON_COMMAND 宏:通过参数指定命令 I

3、D 和消息处理函数。如 ON_COMMAND(ID_EDIT_PASTE, OnEditPaste),其中第二个参数 OnEditPaste的原型说明为:void CView:OnEditPaste()。 ON_UPDATE_COMMAND_UI 宏:用于更新菜单的状态。 前缀为”ON_”控件通知消息宏:这类宏可能带有三个参数,如 ON_CONTROL,就需要指定控制窗口 ID,通知码和消息处理函数;也可能带有两个参数,如具体处理特定通知消息的宏ON_BN_CLICKED、ON_LBN_DBLCLK、ON_CBN_EDITCHANGE 等,需要指定控制窗口 ID 和消息处理函数。 实现用户自定

4、义消息的 ON_MESSAGE 宏:ON_MESSAGE(message, memberFxn)。第一个参数为消息号,第二个参数为消息处理函数。二、手工进行消息映射上面是使用类向导工具自动进行的消息映射,下面我们通过手工的方式来实现同样的功能,以加深对消息映射的理解。手工映射的主要步骤是: 在.h 头文件中:声明消息响应函数、声明消息映射。如:afx_msg void OnPaint(); /声明消息响应函数DECLARE_MESSAGE_MAP() /声明消息映射 在.cpp 文件中:进行消息映射。如:BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd) /消息映射开始ON

5、_WM_PAINT() /WM_PAINT 消息映射宏END_MESSAGE_MAP() /结束消息映射详见下例 (工程 1Win32MFC):使用 VC6.0 建立一个 Win32 应用程序空工程 Win32MFC,按 Alt + F7 调出工程设置界面,或者点击菜单ProjectSettingsGeneralMicrosoft Foundation Classes选择 Use MFC in a Shared DLL,使该工程支持 MFC 类库。如果使用 VS2008,则还需要另外进行如下的设置:将项目属性链接器高级入口点的值设置为 WinMainCRTStartup然后添加如下 2 个文件

6、:(其中用到了 MFC 中的 CWinApp 和 CFrameWnd 类,后面会讲,这里只是为了理解消息映射,先不用理会这 2 个类)头文件:/Win32MFC.h#include class CMyApp : public CWinApppublic:virtual BOOL InitInstance();class CMyWnd : public CFrameWndpublic:CMyWnd();protected:afx_msg void OnPaint();/手工声明消息响应函数DECLARE_MESSAGE_MAP() /手工声明消息映射;实现文件:/Win32MFC.cpp#inc

7、lude Win32MFC.hCMyApp theApp;BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd) /消息映射开始ON_WM_PAINT() /WM_PAINT消息映射宏END_MESSAGE_MAP() /结束消息映射BOOL CMyApp:InitInstance()m_pMainWnd = new CMyWnd;m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;CMyWnd:CMyWnd()Create(NULL, Win32 MFC Application);/手

8、工定义消息响应函数OnPaint(),并添加函数处理代码void CMyWnd:OnPaint()CPaintDC dc(this);CRect rect;GetClientRect(dc.DrawText(大地震,海啸天灾;核危机,利比亚战火人祸,-1, 编译运行。以上就是最简单的 MFC 工程,我们即将学习的 MFC 单文档工程和对话框工程等都是在这种简单 MFC 的基础上扩展而来的。三、翻译 DECLARE_MESSAGE_MAP()等宏,发现和我们前面讲过的 Win32Class 几乎是一样的。见工程“2Win32MFC_翻译宏”四、第一个 MFC 程序1、建立一个 SDI 程序“3S

9、DI”2、介绍 SDI 程序中的 App 类,Frame 类,View 类,Doc 类,以及他们之间的相互关系。3、WinMain 咋不见了?简单的跟踪执行,理解 SDI 执行过程。4、在 View 类的 OnDraw 中输出 ”Hello world!”5、事件、消息、虚函数afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);ON_WM_CREATE()afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);ON_WM_KEYDOWN()afx_msg void OnLBu

10、ttonDown(UINT nFlags, CPoint point);ON_WM_LBUTTONDOWN()ON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew) /staticafx_msg void OnAppAbout();ON_COMMAND(ID_APP_ABOUT, OnAppAbout)virtual BOOL PreCreateWindow(CREATESTRUCTvirtual void OnDraw(CDC* pDC); / overridden to draw this viewafx_msg BOOL OnEraseBkgnd(CDC*

11、pDC);ON_WM_ERASEBKGND()BOOL CSDIView:OnEraseBkgnd(CDC* pDC) static BOOL bDone = FALSE;if (bDone = FALSE)bDone = TRUE;HBRUSH hBrush = (HBRUSH):GetStockObject(BLACK_BRUSH);:SetClassLong(m_hWnd, GCL_HBRBACKGROUND, (LONG)hBrush);/联想到:SetWindowLong()函数,作用是?return CView:OnEraseBkgnd(pDC);在前面的课程中,我们处理消息时,除

12、了要判断主消息值 uMsg 外,总是要判断wParam 和 lParam 这 2 个附加消息参数,以完整的表达一个消息的全部含义。但上面的OnKeyDown 和 OnLButtonDown 中,我们没有见到 wParam 和 lParam 的身影,这是因为MFC 已经智能的帮助我们将这 2 个参数转换成了相应消息函数的参数了,转换后的参数直接表明了参数的具体含义,更加人性化了。PreCreateWindow 和 OnCreate 的不同在于:OnCreate 是消息 WM_CREATE 的响应函数,是由:CreateWindow 函数触发的消息。而 PreCreateWindow 不对应任何消

13、息,它只是一个虚函数,是在其父类中的:CreateWindow 函数之前调用的,是为了给程序员一个在CreateWindow 执行之前改变窗口外观的机会。 OnCreate 和 PreCreateWindow 函数的参数中都涉及到了一个 CREATESTRUCT 结构,其作用相同。PreCreateWindow 先执行,OnCreate 后执行。由此可以推断,虚函数 OnDraw 也是类似的作用,是在消息 WM_PAINT 的响应函数OnPaint 中进行调用的。实际情况也是如此,可以跟踪 MFC 的核心代码可以证实这点。/文件 VIEWCORE.CPP 代码片段:void CView:OnP

14、aint()/ standard paint routineCPaintDC dc(this);OnPrepareDC(OnDraw(6、预编译头文件 stdafx.h,对 MFC 源代码的引用就在这里。#include / MFC 核心和标准组#include / MFC 扩展#include / MFC 自动化类#include / MFC 支持的 IE4 的通用控件#ifndef _AFX_NO_AFXCMN_SUPPORT#include / MFC 支持的 Windows 通用控件#endif / _AFX_NO_AFXCMN_SUPPORT五、Windows 消息分类Windows

15、 消息可以分为以下 4 类:1、标准消息:即以 WM_开头的消息,但 WM_COMMAND 除外。从 CWnd 派生的所有类均可接收该类消息。2、命令消息:即以 WM_COMMAND 形式出现的消息,如菜单、快捷键、工具条按钮消息都是命令消息。从 CCmdTarget 派生的类可以接收该类消息。 (重温第一天第一个作业 Win32 自动创建 Hello world 的代码,其中就有 WM_COMMAND 的用法实例)3、通告消息:控件产生的消息,如按钮、编辑框产生的消息等。从 CCmdTarget 派生的类可以接收该类消息。4、用户自定义消息:为了跟系统消息区分,系统专门划分一段消息编号区间,

16、让用户定义自己的消息。其中,菜单命令的传递路径如下:消息传递:框架类视类消息处理:视类文档类视类框架 应用程序类完成一个自定义消息的完整步骤如下: 定义消息值:#define UM_SEND_DATA WM_USER + 1 定义消息响应函数:afx_msg void OnSendData(); 消息映射:ON_MESSAGE(UM_SEND_DATA, OnSendData) 实现消息响应函数,编写其中的代码 在需要的地方调用:SendMessage(hWnd, UM_SEND_DATA);六、MFC 类向导工具 class wizard 用法介绍可以使用类向导(class wizard)工具来建立消息映射、添加类成员变量和成员函数等。一般类向导生成的代码最好不要手动修改。如对一个菜单项使用类向导进行消息映射:1、点击右键选择 class wi

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 机械理论及资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号