MFC消息映射

合集下载

mfc 消息机制

mfc 消息机制

mfc消息机制
MFC(Microsoft Foundation Class)是微软开发的一种面向对象的C++框架,用于Windows操作系统的应用程序开发。

MFC消息机制是MFC框架的核心之一,其基本原理是在窗口、控件等对象之间传递消息,以便处理事件和交互。

具体而言,MFC消息机制包括以下几个方面:1.消息循环:MFC使用一个消息循环来接受和处理Windows操作系统发送的Windows消息,处理完消息后将处理结果反馈给Windows操作系统。

2.消息映射:MFC中的控件和窗口都有一个关联的消息映射表,用于将Windows消息映射到应用程序代码中的相应处理函数上。

当某个控件或窗口收到消息后,根据消息类型在相应的消息映射表中查找对应的消息处理函数,并调用相应的处理函数处理消息。

3.消息类型:MFC处理的Windows消息类型包括键盘和鼠标消息、定时器消息、系统负载消息、窗口大小变化消息等等,具体的消息类型可以在MFC框架的文档中查找。

4.消息处理函数:MFC中的消息处理函数是C++成员函数,定义为afx_msg 修饰的函数,Windows消息处理函数命名时需要遵循一定的命名规则,例如OnPaint()函数用于处理绘图事件。

需要注意的是,MFC消息机制是针对Windows操作系统设计的,其他操作系统可能具有不同的消息机制。

此外,MFC框架已经不是微软推荐的最先进的应用程序开发框架,已经逐渐被其他框架和技术所取代,例如.NET Framework,WPF,UWP等。

MFC简答题

MFC简答题

简述MFC消息映射机制
MFC采用消息映射来处理消息。

绝大多数消息都可由MFC的CLassWizard 来映射。

将ClassWizard对话框切换到MessaageMaps页面,选择相应的Class Name与Object IDs选项,在Messages列表中选定消息名。

双击消息在XXX 类中自动添加了该消息的处理函数。

ClassWizard消息映射包括三个方面的内容。

一是在头文件XXX.h中声明消息处理函数;其次在XXX.cpp源文件前面的消息映射入口处,添加了相应的映射宏。

最后在XXX.cpp文件中写入一个空消息处理函数的模板以便用户填入具体代码。

简述模式对话框编程的主要步骤
(1)用MFC AppWizard[exe]生成单文档
(2)在资源视图中右击Dialog文件夹插入对话框
(3)设计对话框
右击工具栏空白处打开控件工具栏
(4)测试对话框单击编排/Test或Ctrl+T
(5)创建对话框类
在对话框模板空白处双击鼠标为对话框创建新类(或Ctrl+W)
(6)创建对话框数据成员
添加与对话框控件相关联的数据成员。

目的是接收用户输入的数据。

Ctrl+W->Member Variables
(7)在程序中使用对话框
若新建的对话框类为CDlog,在程序中使用如下代码:
CDlog dlg; //对话框类对象;
dlg.DoModal();// DoModal() :模式对话框函数用于对话框的显示与终止
(8) 在XXXView.cpp中添加头文件
如: #include “Dlog.h”。

谈谈MFC中的消息映射

谈谈MFC中的消息映射

谈谈MFC中的消息映射作者:未知文章来源:网络引言:众所周知,windows是基于消息驱动的,作好消息处理是WINDOWS编程的关键任务之一,用VC制作WINDOWS程式同样离不开消息的处理。

虽然VC++6的类向导可以完成绝大部分工作,但不幸的是,它并不能完成所有的工作。

这就要求我们对 VC中消息的处理有一个比较清淅的认识。

只有这样才可能在必要的时候亲自动手完成一些复杂的消息映射处理。

在MFC中消息是通过一种所谓的消息映射机制来处理的。

其实质是一张消息及其处理函数的一一对应表以及分析处理这张表的应用框架内部的一些程序代码.这样的好处是可以避免像早期的SDK编程一样需要罗列一大堆的CASE语句来处理各种消息.由于不同种类的消息其处理方法是不同的,所以我们有必要先弄清楚 WINDOWS消息的种类。

背景:WINDOWS 消息的种类WINDOWS中消息主要有以下三种类型:1、标准的WINDOWS消息:这类消息是以WM_为前缀,不过WM_COMMAND例外。

例如: WM_MOVE、WM_QUIT等.2、命令消息:命令消息以WM_COMMAND为消息名.在消息中含有命令的标志符ID,以区分具体的命令.由菜单,工具栏等命令接口对象产生.3、控件通知消息:控件通知消息也是以WM_COMMAND为消息名.由编辑框,列表框,子窗口发送给父窗口的通知消息.在消息中包含控件通知码.以区分具体控件的通知消息.其中标准的WINDOWS消息及控件通知消息主要由窗口类即直接或间接由CWND类派生类处理.相对标准WINDOWS消息及控件通知消息而言,命令消息的处理对象范围就广得多.它不仅可以由窗口类处理,还可以由文档类,文档模板类及应用类所处理。

方法:不同种类消息的映射方法。

在以上三种消息中,标准的WINDOWS消息映射是相当简单的。

可直接通过类向导完成不同消息的映射处理,所以不在本文讨论之列。

凡是从CcmdTarget类派生的类都可以有消息映射.消息映射包括如下两方面的内容:在类的定义文件中(.H)中加上一条宏调用:DECLARE_MESSAGE_MAP()通常这条语句中类定义的最后.在类的实现文件(.CPP)中加上消息映射表:BEGIN_MESSAGE_MAP(类名,父类名)………..消息映射入口项.……….END_MESSAGE_MAP( )幸运的是除了某些类(如没有基类的类或直接从CobjectO类派生的类)外.其它许多类均可由类向导生成.尽管生成的类只是一个框架,需要我们补充内容.但消息映射表已经为我们加好了.只是入口项有待我们加入.命令消息映射入口项是一个ON_COMMAND的宏.比如文件菜单下的"打开…"菜单(ID 值为ID_FILE_OPEN)对应的消息映射入口项为:ON_COMMAND(ID_FILE_NEW,OnFileOpen)加入消息映射入口项之后需要完成消息处理函数.在类中消息处理函数都是类的成员函数,要响应一个消息,就必须定义一个该消息的处理函数.定义一个消息处理函数包括以下三方面的内容.1.在类定义中加入消息处理函数的函数原型(函数声明)2.在类的消息映射表中加入相应的消息映射入口项.3.在类的实现中加入消息处理函数的函数体.需要说明的是消息处理函数的原型一定要以afx_msg打头.比如:afx_msg OnFileOpen();// 函数原型作为约定.消息处理函数一般以On打头但有时我们可能想用一个消息处理函数来处理一批消息。

MFC 消息映射机制详解

MFC 消息映射机制详解

真正处理消息的是所谓的窗口过程(LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)),这个函数的参数记录了过程对应的窗口、消息的ID以及参数,在其内部开发者可以实现自己需要的消息处理功能。那消息分发是如何发送给窗口过程的呢?我们知道窗口创建过程中有一个注册窗口类的步骤,如下:
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WINDOWSP);
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
原文出处: Ocean2006
Windows程序和MFC程序是靠消息驱动的,他们对于消息的处理本质上是相同的。只是Windows程序对于消息处理的过程十分清晰明了,MFC程序则掩盖了消息处理的过程,以消息映射的方式呈现在开发者面前,使得开发消息的处理十分简单。用多了mfc就想对它的消息映射机制有一个本质的了解,下面将对消息映射做详细的分析。当然,在分析MFC消息映射之前首先对Windows程序的消息处理过程进行一个简单的描述。

MFC六大核心机制

MFC六大核心机制

MFC六大核心机制1.消息映射机制:MFC使用明确的消息映射机制来处理用户界面和系统事件。

应用程序通过重写消息映射函数来处理不同的消息事件,如鼠标点击、按键操作等。

消息映射机制使得开发者可以方便地响应和处理不同的用户交互动作。

2. 文档视图(Doc/View)体系:MFC采用了文档视图体系,将应用程序数据(文档)和用户界面(视图)分离。

文档表示应用程序的数据,视图代表用户界面,通过文档视图模式可以实现多视图的显示和操作。

开发者可以自定义文档类和视图类,通过它们来管理和展示数据。

3.对象序列化机制:对象序列化是指将对象的状态转换为可以存储或传输的格式,以便于在不同的环境中恢复对象的状态。

MFC提供了强大的对象序列化支持,可以方便地对应用程序的数据进行存储和加载。

开发者只需将需要序列化的成员变量标记为可序列化,并实现相关的序列化函数即可实现数据的持久化。

4.多线程支持:MFC提供了多线程支持,使得应用程序可以在多个线程中同时执行任务。

开发者可以使用MFC提供的线程类来创建和管理线程,并通过消息机制进行线程间的通信。

多线程支持有助于提高应用程序的性能和响应能力。

MFC的运行时类是一组用于封装常用功能的类,包括字符串操作、容器类、文件I/O等。

这些类提供了方便、高效的操作接口,减少了开发者对底层操作的依赖。

开发者可以直接使用MFC提供的运行时类来简化开发过程。

6.扩展性:MFC提供了丰富的扩展性机制,包括自定义控件、自定义对话框、自定义视图等。

开发者可以通过派生已有的MFC类来创建自定义的控件或界面,以满足特定的应用程序需求。

扩展性机制使得开发者可以充分发挥自己的创造力和想象力,实现更加个性化的应用程序。

总结:MFC六大核心机制为开发者提供了丰富的类和功能,使得开发Windows图形界面应用程序更加简单和高效。

通过消息映射机制、文档视图体系、对象序列化机制、多线程支持、运行时类和扩展性机制,开发者可以轻松地实现各种应用程序的需求,并提供更好的用户体验。

消息映射 mfc

消息映射 mfc

主要内容
3.1 事件驱动程序机制
3.2 消息的结构及类别
3.3 MFC消息映射原理
3.4 消息映射的实现形式
3.5 自定义消息处理
3.1 事件驱动程序机制
事件
用户对交互界面进行操作(例如操作鼠标、键盘、改变 窗口、选择菜单项等);或者程序的某种特定运行(窗口 的创建显示、窗口客户区中被显示数据修改引起的重绘操 作)都会引起事件的产生。
启动
Winmain,RegisterClass,CreateWindow……
消息处理
Getmessage/Dispatchmessage window procedure various windows API
输入姓名 输入第1次成绩 输入第2次成绩 输入第3次成绩
结束
计算平均成绩
基于事件触发而运行的应用程序必须是完全面向 消息处理的,即始终按如下步骤循环:
主要参数:
hWnd: message: wParam: lParam: 接收消息的窗口句柄 WM_XXX 随 WM_XXX 而变 随 WM_XXX 而变
产生途径:
·窗口范围内的交互操作产生; ·系统框架产生的窗口消息; ·程序根据需要发送窗口消息。
举例:
WM_CREATE
The WM_CREATE message is sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. The window procedure of the new window receives this message after the window is created, but before the window becomes visible. The message is sent before the CreateWindowEx or CreateWindow function returns.

MFC消息映射及消息处理函数原型

MFC消息映射及消息处理函数原型
ON_EN_MAXTEXT(<id>, <memberFxn>)
afx_msg void memberFxn();
ON_EN_SETFOCUS(<id>, <memberFxn>)
afx_msg void memberFxn();
ON_EN_UPDATE(<id>, <memberFxn>)
afx_msg void memberFxn();
ON_NOTIFY_EX_RANGE(<wNotifyCode>, <id>, <idLast>, <memberFxn>)
afx_msg BOOL memberFxn(UINT, NMHDR*, LRESULT*);
ON_NOTIFY_RANGE(<wNotifyCode>, <id>, <idLast>, <memberFxn>)
afx_msg void memberFxn();
ON_STN_ENABLE(<id>, <memberFxn>)
afx_msg void memberFxn();
标准Windows消息( WM_xxx )的对应规则:
消息映射
对应处理函数原型
ON_WM_ACTIVATE()
afx_msg void OnActivate(UINT, CWnd*, BOOL);
afx_msg void memberFxn(UINT);
ON_CONTROL_REFLECT(<wNotifyCode>, <memberFxn>)
afx_msg void memberFxn();

消息映射及MFC入门

消息映射及MFC入门

MFC消息映射及MFC入门一、MFC消息映射机制在前面Win32Class工程中,我们进行了Win32环境下的“消息映射”。

其实,通过前面的过程,我们已经不知不觉的接触到了MFC消息映射的核心。

MFC环境下的消息映射,其原理和我们讲解过的Win32下的消息映射是类似的。

简单地讲,就是让程序员指定要某个MFC类(有消息处理能力的类)处理某个消息。

MFC提供了工具ClassWizard来帮助实现消息映射,在处理消息的类中添加一些有关消息映射的内容和处理消息的成员函数。

程序员负责编写消息处理函数的代码,实现所希望的功能。

可以通过如下的3个重要的宏来实现MFC消息映射,这些宏功能强大,其实现相对也比较复杂。

这里只要求我们会用就可以。

稍后我们会用其实际代码替换这些宏,就能理解了。

●DECLARE_MESSAGE_MAP:初始化消息映射表,实际上是给所在类添加几个用于消息处理的静态成员变量和静态或虚拟函数。

●BEGIN_MESSAE_MAP:开始消息映射。

●END_MESSAE_MAP:结束消息映射。

其他常见的、用于实现MFC消息的宏还有:●前缀为“ON_WM_”的宏:用于Windows消息的宏(不带参数)如:ON_WM_PAINT()把消息WM_PAINT映射到OnPaint函数。

●ON_COMMAND宏:通过参数指定命令ID和消息处理函数。

如ON_COMMAND(ID_EDIT_PASTE, OnEditPaste),其中第二个参数OnEditPaste 的原型说明为:void CView::OnEditPaste()。

●ON_UPDA TE_COMMAND_UI宏:用于更新菜单的状态。

●前缀为”ON_”控件通知消息宏:这类宏可能带有三个参数,如ON_CONTROL,就需要指定控制窗口ID,通知码和消息处理函数;也可能带有两个参数,如具体处理特定通知消息的宏ON_BN_CLICKED、ON_LBN_DBLCLK、ON_CBN_EDITCHANGE等,需要指定控制窗口ID和消息处理函数。

关于MFC消息映射机制剖析

关于MFC消息映射机制剖析

关于MFC消息映射机制剖析软采用了所谓的消息映射机制,来完成不同对象之间消息的传递,本文就MFC9.0源码进行分析,大致讲解MFC的消息映射机制。

步入正题,在AfxWinMain() 函数中,当MFC框架初始化完成后,即pThread->InitInstance() 执行完成,就开始进行消息循环,入口函数是pThread->Run():[cpp]view plaincopy1.// Perform specific initializations2.if (!pThread->InitInstance())// MFC初始化框架3.{4.if (pThread->m_pMainWnd != NULL)5. {6. TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");7. pThread->m_pMainWnd->DestroyWindow();8. }9. nReturnCode = pThread->ExitInstance();10.goto InitFailure;11.}12.nReturnCode = pThread->Run();// 进入消息循环执行CWinApp:: Run():[cpp]view plaincopy1.// Main running routine until application exits2.int CWinApp::Run()3.{4.if (m_pMainWnd == NULL && AfxOleGetUserCtrl())5. {6.// Not launched /Embedding or /Automation, but has no main window!7. TRACE(traceAppMsg, 0, "Warning: m_pMainWnd is NULL in CWinApp::Run -quitting application.\n");8. AfxPostQuitMessage(0);9. }10.return CWinThread::Run();11.}执行CWinThread::Run():[cpp]view plaincopy1.// main running routine until thread exits2.int CWinThread::Run()3.{4. ASSERT_VALID(this);5. _AFX_THREAD_STATE* pState = AfxGetThreadState();6.7.// for tracking the idle time state8.BOOL bIdle = TRUE;9.LONG lIdleCount = 0;10.11.// acquire and dispatch messages until a WM_QUIT message is received.12.GetMessage:从系统获取消息,将消息从系统中移除,属于阻塞函数。

mfc消息映射及处理

mfc消息映射及处理

MFC中处理消息的顺序1.AfxWndProc()接收消息,寻找消息所属的CWnd对象,然后调用AfxCallWndProc( )。

2.AfxCallWndProc()存储消息(消息标识符和消息参数)供未来参考,然后调用WindowProc( )。

3.WindowProc()发送消息给OnWndMsg( ),如果消息未被处理,则发送给DefWindowproc( )。

4.OnWndMsg()首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数;对于WM_NOTIFY消息调用OnNotify()消息响应函数。

任何被遗漏的消息将是标准消息。

OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。

如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数。

5.OnCommand()查看这是不是一个控件通知(lParam参数不为NULL),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果它不是一个控件通知,或者控件拒绝映射的消息,OnCommand()就会调用OnCmdMsg()函数。

6.OnNotify( )也试图将消息映射到制造通知的控件;如果映射不成功,OnNotify( )就调用相同的OnCmdMsg( )函数。

7.根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。

例如:如果拥有该窗口的类是一个框架类,则命令和控件通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数。

MFC中创建窗口的顺序1.PreCreateWindow()是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数(可以设置窗口风格等等)。

2.PreSubclassWindow()也是一个重载函数,允许首先子分类一个窗口OnGetMinMaxInfo()为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者最小尺寸。

【初学VC讲稿】第2篇:MFC消息映射

【初学VC讲稿】第2篇:MFC消息映射

CMyApp theApp; //应用程序对象
好了,请大家按照上篇的方法运行一下修改后的程序,是不是已经响应了鼠标左键
按下的消息。
ON_WM_PAINT()//响应WM_PAINT消息
END_MESSAGE_MAP()
【3】消息响应函数[afx_msg void OnPaint();]:即处理消息的函数。
afx_msg只是将函数标记为消息响应函数,你把它去掉程序也可以正常
运行,只不过是习惯的标记罢了!
【4】当MFC程序要处理消息时,你要告诉MFC你要处理什么消息以及在
};
//消息映射表
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_PAINT()//响应WM_PAINT消息,将会调用OnPaint()
ON_WM_LBUTTONDOWN() //响应鼠标左键按下消息,ags, CPoint point)
}
这些工作你也可以手动完成(如第1篇看到的,只不过在那一篇中我们把这些
东西都放在了MyApp.cpp文件中,应该把声名放在".h"文件中,把实现放在
".CPP"文件中,VC中就是这样管理每一个类的)!
【5】MFC程序中消息的种类:
(A)窗口消息(Window Message):
这种消息一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗口等。
响应函数:
//MyApp.cpp
#include <afxwin.h>//必要的包含文件
//主窗口类
class CMyFrameWnd : public CFrameWnd

关于MFC中的消息映射

关于MFC中的消息映射

深入浅出MFC_消息映射的实现一,对Windows消息进行分类:队列消息与非队列消息,系统消息与应用程序消息。

二,对消息结构MSG和Windows以及MFC消息处理进行介绍。

三,将MFC处理的消息分成三类:windows消息(前缀以WM_开头,WM_COMMAND除外),控制通知消息(控制子窗口发送给父窗口的WM_COMMAND通知消息),命令消息(来自菜单、工具栏按钮、加速键等用户接口对象的WM_COMMAND通知消息,属于应用程序自己定义的消息)。

四,讲述MFC实现消息映射的方法,DECLARE_MESSAGE_MAP 与BEGIN_MESSAGE_ MAP END_MESSAGE_MAP 的实现。

特别是对变量AFX_MSGMAP_ENTRY _messageEntries[],AFX_MSGMAP messageMa p 以及对函数_GetBaseMessageMap() GetMessageMap()的作用的讲述。

以及其他MFC常用的消息映射的宏(MFC根据消息的不同和消息处理方式的不同,把消息映射划分成若干类别,每一类的消息映射至少有一个共性:消息处理函数的原型相同。

对每一类消息映射,MFC定义了一个宏来简化初始化消息数组的工作。

例如,前文提到的ON_COMMAND宏用来映射命令消息,只要指定命令ID和消息处理函数即可,因为对这类命令消息映射条目,其他四个属性都是固定的)。

五、讲述CCmdTarget类,CCmdTarget类是MFC消息映射的基础、核心,CCmdTarget 类有两个与消息映射密切相关的函数OnCmdMsg(虚拟,用来传递和发送消息、更新用户界面对象的状态)与DispatchCmdMsg(静态,用于分发windows消息)。

(在OLE应用中,C CmdTarget是MFC处理模块状态的重要环节,它起到了传递模块状态的作用:其构造函数获取当前模块状态,并保存在成员变量m_pModuleState里头。

MFC常用消息-处理函数-映射

MFC常用消息-处理函数-映射

MFC常用消息-处理函数-映射常用消息1、WM_LBUTTONDOWN产生:单击。

参数:wParam:包含一个整数值,以标识鼠标键的按下状态。

鼠标的按下标识及说明:MK_LBUTTON 标识按下鼠标左键MK_MBUTTON 标识按下鼠标中键MK_RBUTTON 标识按下鼠标右键lParam:长参数lParam的低字位包含当前坐标的x坐标,在高字节包含当前坐标的Y坐标。

相似的消息有:WM_LBUTTONUP、WM_RBUTTONDOWN、WM_RBUTTONUP、WM_LBUTTONDBLCLK、WM_RBUTTONDBLCLK2、WM_KEYDOWN产生:按下一个非系统键的时候产生该事件,系统键是指实现系统操作的组合键,例如,Alt与某个功能键的组合以实现菜单操作等。

参数:wParam:按下键的虚拟键盘码,虚拟键码用来标识按下或者释放的是哪个键,例如功能键F1的虚拟键码在windows.h文件中定义为VK_F1。

lParam:长参数中记录了按键的重复次数,扫描码、转移代码、先前键的状态等信息。

相似的消息有WM_KEYUP:放开按下的非系统键时产生的事件。

3、WM_CHAR产生:按一个非系统键时产生。

参数:wParam:所按下的键的ASCII码。

lParam:长参数中记录了按键的重复次数,扫描码、转移代码、先前键的状态等信息。

4、WM_CREATE产生:由CreateWindow函数发出,创建窗口。

参数:wParam:没用。

lParam:包含一个指向CREATESTRUCT数据结构的指针,该结构是传递给CreateWindow函数的参数的副本。

5、WM_CLOSE产生:当关闭当前窗口时产生。

参数:wParam:未用。

lParam:未用。

6、WM_DESTROY产生:当窗口要销毁时由DestroyWindow函数发出。

参数:wParam:没用到。

lParam:没用到。

7、WM_QUIT产生:退出应用程序时由PostQuitMessage函数发出。

MFC消息映射机制剖析

MFC消息映射机制剖析

一,消息映射机制1,消息响应函数:(例:在CDrawView类响应鼠标左键按下消息)1)在头文件(DrawView.h)中声明消息响应函数原型。

//{{AFX_MSG(CDrawView) //注释宏afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//}}AFX_MSG //注释宏说明:在注释宏之间的声明在VC中灰色显示。

afx_msg宏表示声明的是一个消息响应函数。

2)在源文件(DrawView.cpp)中进行消息映射。

BEGIN_MESSAGE_MAP(CDrawView, CView)//{{AFX_MSG_MAP(CDrawView)ON_WM_LBUTTONDOWN()//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()说明:在宏BEGIN_MESSAGE_MAP()与END_MESSAGE_MAP()之间进行消息映射。

宏ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN与它的响应函数OnLButtonDown ()相关联。

这样一旦有消息的产生,就会自动调用相关联的消息响应函数去处理。

宏ON_WM_LBUTTONDOWN()定义如下:#define ON_WM_LBUTTONDOWN() \{ WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp, \(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(UINT,CPoint))&OnLButtonDown },3)源文件中进行消息响应函数处理。

mfc消息映射机制

mfc消息映射机制

mfc消息映射机制MFC消息映射机制是MFC框架中的一个重要机制,它是实现消息响应的关键。

在MFC中,消息是指Windows操作系统中的消息,例如鼠标点击、键盘输入、窗口大小改变等。

MFC消息映射机制是将消息与相应的处理函数关联起来的过程,使得程序能够响应用户的操作。

MFC消息映射机制的实现依赖于消息映射表。

消息映射表是一个数组,其中每个元素都是一个消息映射结构体。

消息映射结构体包含了消息的类型、消息的ID、消息的处理函数等信息。

当程序接收到一个消息时,MFC会根据消息的类型和ID在消息映射表中查找相应的处理函数,并将消息传递给该函数进行处理。

MFC消息映射机制的优点在于它能够将消息处理函数与消息的类型和ID进行关联,使得程序的代码更加清晰、易于维护。

此外,MFC 还提供了一些宏定义,例如DECLARE_MESSAGE_MAP和BEGIN_MESSAGE_MAP,使得消息映射表的定义更加简洁、易于理解。

MFC消息映射机制的使用方法如下:1. 在类的头文件中声明消息映射表,使用DECLARE_MESSAGE_MAP宏定义。

2. 在类的实现文件中定义消息映射表,使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏定义。

3. 在消息映射表中添加消息映射结构体,使用ON_MESSAGE、ON_COMMAND等宏定义。

4. 在消息处理函数中编写相应的代码,处理消息。

例如,以下代码实现了一个响应鼠标点击消息的处理函数:afx_msg LRESULT CMyWnd::OnLButtonDown(WPARAM wParam, LPARAM lParam){// 处理鼠标点击消息return 0;}BEGIN_MESSAGE_MAP(CMyWnd, CWnd)ON_WM_LBUTTONDOWN()END_MESSAGE_MAP()在上述代码中,CMyWnd是一个继承自CWnd的窗口类,OnLButtonDown是处理鼠标点击消息的函数。

第四课:MFC画图-MFC消息映射机制的剖析

第四课:MFC画图-MFC消息映射机制的剖析

MFC消息映射机制的剖析,讲述如何运用ClassWizard,,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。

掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的,融合具体的画图程序进行分析。

如何设置封闭图形的填充刷子(位图画刷与透明画刷的使用)。

主要介绍一些绘图方面的知识。

程序实例:新建工程:->MFC AppWizard[exe] 文件面为Draw 选择单文档的应用程序完成之后编译运行。

画直线、画图、画刷画位图、空白画刷操作步骤●明确画图的思路:按下鼠标左键画图的原点,拖动鼠标到另外一个位置松开鼠标左键画图的终点。

●画图需要消息的捕获。

捕获的对象是鼠标左键按下WM_LBUTTONDOWN和抬起WM_LBUTTONUP的消息。

●这两消息的捕获、响应在窗口类中进行,可以在框架类Frame类中也可以在视类View类中。

●要对消息进行捕获我们需要设置一些额外的函数,这些函数MFC都有提供。

如我们在CMainFrame上点击右键选择增加windows消息处理Addwindows message handler……,选择WM_LBUTTONDOWN点击“AddHandler”添加而后点击“Edit Existing”退出。

CMainFrame message handlers 在CMainFrame最底下被创建。

具体内容详见下面程序代码。

(这段代码添加的位置是在implementation of the CMainFrame class中,文件名为CMainFrame.cpp)●为了简单说明每一步的作用这个程序做出的反应,在消息响应函数中添加一个MessageBox程序代码,这个MessageBox要比先前的WinApi中使用的少一个” HWND hWnd,”参数。

MessageBox在CWnd中是属于其中的一个成员函数,他不需要句柄因为有一个数据成员保存了和这个窗口相关的句柄。

面向对象技术中的名词解释mfc

面向对象技术中的名词解释mfc

面向对象技术中的名词解释mfc
MFC是MicrosoftFoundationClasses的缩写,是微软公司的一个面向对象的工具集,用于构建Windows应用程序。

MFC提供了一系列C++类,封装了Windows API,使得程序员能够更容易地开发Windows 应用程序。

以下是面向对象技术中的一些MFC相关的名词解释:
1. 类:MFC是基于面向对象的编程模型构建的工具集,类是其中最基本的组成部分。

类是一种用户自定义的数据类型,用于封装数据和方法。

2. 对象:对象是类的一个实例,是程序中的一个具体实体。

在MFC中,对象通常是窗口、按钮、编辑框等用户界面元素。

3. 消息映射:消息映射是一种机制,用于处理来自Windows操作系统的消息。

在MFC中,每个窗口都有一个消息映射表,用于将消息与类成员函数关联起来。

4. 文档视图架构:文档视图架构是一种通用的用户界面设计模式,由文档对象、视图对象和框架窗口组成。

在MFC中,文档视图架构被广泛应用于Windows应用程序的开发。

5. 控件:控件是用户界面中的一种元素,如按钮、编辑框、列表框等。

在MFC中,控件通常是类,可以方便地添加到窗口中。

6. 对话框:对话框是一种特殊的窗口,用于和用户进行交互。

在MFC中,对话框是一种类,可以方便地创建和管理对话框。

7. 应用程序框架:应用程序框架是一个通用的程序设计模式,用于简化应用程序的开发。

MFC提供了一个应用程序框架,包括应用
程序类、主窗口类、文档类、视图类等组件。

MFC六大核心机制

MFC六大核心机制

MFC六大核心机制MFC(Microsoft Foundation Classes)是微软公司开发的一套基于C++语言的应用程序框架。

它提供了一系列类和函数库,方便开发人员构建Windows应用程序。

MFC框架包含了许多核心机制,下面将介绍其中的六大核心机制。

一、消息映射机制:消息映射机制是MFC框架的核心之一,它用于处理Windows消息。

Windows操作系统是事件驱动的,应用程序需要响应来自用户的输入或系统的消息。

通过消息映射机制,开发人员可以向MFC框架注册处理特定消息的函数,当该消息发生时,框架将自动调用相应的函数进行处理。

开发人员只需要在类的消息映射表中添加相应的消息与处理函数的映射关系,就可以实现消息的处理。

二、文档/视图机制:文档/视图机制是MFC框架中用来管理应用程序数据和图形界面显示的一种机制。

应用程序的数据和用户界面是相互独立的,通过文档/视图机制可以将二者进行分离。

开发人员可以创建一个或多个文档类来管理数据,同时可以创建一个或多个视图类来负责显示用户界面。

MFC框架会自动处理数据和界面之间的同步,例如当数据发生变化时,会自动更新界面;当用户修改界面时,会自动更新数据。

三、消息响应机制:消息响应机制是MFC框架中用来处理用户输入和系统消息的一种机制。

开发人员可以通过消息响应机制,将特定的消息与相应的处理函数进行关联,当该消息发生时,框架会自动调用相应的处理函数。

例如,开发人员可以通过响应鼠标点击消息来实现用户点击按钮的响应,或者通过响应键盘输入消息来实现用户输入的响应。

四、对象模型机制:对象模型机制是MFC框架中用来管理对象的一种机制。

MFC框架使用了一种轻量级的对象模型,对象之间的关系通过继承和组合来实现。

开发人员可以创建自己的类并继承自MFC提供的基类,以实现各种功能。

MFC框架提供了丰富的基类库,包括窗口类、对话框类、控件类等,开发人员可以通过继承这些基类来快速构建自己的应用程序。

关于MFC的消息映射

关于MFC的消息映射

关于MFC的消息映射转自:/article/200501/54449.html近来学习MFC,对其中的消息映射机制一直一知半解,从网上搜了些资料,不是讲解的太表面化,就是过于详细,让人不禁头大。

脑子正处于迷糊状态中,无意搜到了上面链接处的一点资料,其对用于消息映射的宏定义进行了简单注释,我将这些资料进行了整理,力求能给其他朋友一点帮助。

所谓的消息映射,就是说对于每一条消息,都对应有一个处理函数对该消息进行响应。

例如,将按下鼠标左键看做一条消息,当鼠标左键按下时,弹出一个对话框,则这里的消息映射:按下鼠标左键(消息)——弹出一个对话框(消息处理函数)。

要理解MFC的消息映射机制需要理解几个关键的宏定义:DECLARE_MESSAGE_MAP、BEGIN_MESSAGE_MAP、END_MESSAGE_MAP以及向类中添加类自身所要处理的消息的宏(这里以ON_COMMAND为例)。

1、DECLARE_MESSAGE_MAP一般,MFC中的消息处理函数大都是某一个类的成员函数,在定义类的头文件中,我们在类定义中加入DECLARE_MESSAGE_MAP就表示该类支持消息映射。

#define DECLARE_MESSAGE_MAP() \private: \static const AFX_MSGMAP_ENTRY _messageEntries[]; \protected: \static AFX_DATA const AFX_MSGMAP messageMap; \static const AFX_MSGMAP* PASCAL _GetBaseMessageMap(); \virtual const AFX_MSGMAP* GetMessageMap() const; \DECLARE_MESSAGE_MAP()这个宏的作用有3:⑴在类中插入一个静态成员_messageEntries,这是用来存放类要处理的消息的数组(即类本身的消息映射表);⑵另一个静态成员massageMap用来指向基类的消息映射表;⑶安插一个虚函数,其内容有待实现。

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

消息映射的实现Windows消息概述Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。

这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。

消息的分类队列消息和非队列消息从消息的发送途径上看,消息分两种:队列消息和非队列消息。

队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。

这里,对消息队列阐述如下:Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。

鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。

Windows每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。

线程消息队列接收送给该线程所创建窗口的消息。

线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。

除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。

这些队列消息以外的绝大多数消息是非队列消息。

系统消息和应用程序消息从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。

系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER (0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。

消息结构和消息处理消息的结构为了从消息队列获取消息信息,需要使用MSG结构。

例如,::GetMessage函数(从消息队列得到消息并从队列中移走)和::PeekMessage函数(从消息队列得到消息但是可以不移走)都使用了该结构来保存获得的消息信息。

MSG结构的定义如下:typedef struct tagMSG { // msgHWND hwnd;UINT message;WPARAM wParam;LPARAM lParam;DWORD time;POINT pt;} MSG;该结构包括了六个成员,用来描述消息的有关属性:接收消息的窗口句柄、消息标识(ID)、第一个消息参数、第二个消息参数、消息产生的时间、消息产生时鼠标的位置。

应用程序通过窗口过程来处理消息如前所述,每个“窗口类”都要登记一个如下形式的窗口过程:LRESULT CALLBACK MainWndProc (HWND hwnd,// 窗口句柄UINT msg,// 消息标识WPARAM wParam,//消息参数1LPARAM lParam//消息参数2)应用程序通过窗口过程来处理消息:非队列消息由Windows直接送给目的窗口的窗口过程,队列消息由::DispatchMessage等派发给目的窗口的窗口过程。

窗口过程被调用时,接受四个参数:a window handle(窗口句柄);a message identifier(消息标识);two 32-bit values called message parameters(两个32位的消息参数);需要的话,窗口过程用::GetMessageTime获取消息产生的时间,用::GetMessagePos获取消息产生时鼠标光标所在的位置。

在窗口过程里,用switch/case分支处理语句来识别和处理消息。

应用程序通过消息循环来获得对消息的处理每个GDI应用程序在主窗口创建之后,都会进入消息循环,接受用户输入、解释和处理消息。

消息循环的结构如下:while (GetMessage(&msg, (HWND) NULL, 0, 0)) {//从消息队列得到消息if (hwndDlgModeless == (HWND) NULL ||!IsDialogMessage(hwndDlgModeless, &msg) &&!TranslateAccelerator(hwndMain, haccel, &msg)) {TranslateMessage(&msg);DispatchMessage(&msg); //发送消息}}消息循环从消息队列中得到消息,如果不是快捷键消息或者对话框消息,就进行消息转换和派发,让目的窗口的窗口过程来处理。

当得到消息WM_QUIT,或者::GetMessage出错时,退出消息循环。

MFC消息处理使用MFC框架编程时,消息发送和处理的本质也如上所述。

但是,有一点需要强调的是,所有的MFC 窗口都使用同一窗口过程,程序员不必去设计和实现自己的窗口过程,而是通过MFC提供的一套消息映射机制来处理消息。

因此,MFC简化了程序员编程时处理消息的复杂性。

所谓消息映射,简单地讲,就是让程序员指定要某个MFC类(有消息处理能力的类)处理某个消息。

MFC提供了工具ClassWizard来帮助实现消息映射,在处理消息的类中添加一些有关消息映射的内容和处理消息的成员函数。

程序员将完成消息处理函数,实现所希望的消息处理能力。

如果派生类要覆盖基类的消息处理函数,就用ClassWizard在派生类中添加一个消息映射条目,用同样的原型定义一个函数,然后实现该函数。

这个函数覆盖派生类的任何基类的同名处理函数。

下面几节将分析MFC的消息机制的实现原理和消息处理的过程。

为此,首先要分析ClassWizard实现消息映射的内幕,然后讨论MFC的窗口过程,分析MFC窗口过程是如何实现消息处理的。

消息映射的定义和实现MFC处理的三类消息根据处理函数和处理过程的不同,MFC主要处理三类消息:Windows消息,前缀以“WM_”打头,WM_COMMAND例外。

Windows消息直接送给MFC窗口过程处理,窗口过程调用对应的消息处理函数。

一般,由窗口对象来处理这类消息,也就是说,这类消息处理函数一般是MFC窗口类的成员函数。

控制通知消息,是控制子窗口送给父窗口的WM_COMMAND通知消息。

窗口过程调用对应的消息处理函数。

一般,由窗口对象来处理这类消息,也就是说,这类消息处理函数一般是MFC窗口类的成员函数。

需要指出的是,Win32使用新的WM_NOFITY来处理复杂的通知消息。

WM_COMMAND类型的通知消息仅仅能传递一个控制窗口句柄(lparam)、控制窗ID和通知代码(wparam)。

WM_NOTIFY能传递任意复杂的信息。

命令消息,这是来自菜单、工具条按钮、加速键等用户接口对象的WM_COMMAND通知消息,属于应用程序自己定义的消息。

通过消息映射机制,MFC框架把命令按一定的路径分发给多种类型的对象(具备消息处理能力)处理,如文档、窗口、应用程序、文档模板等对象。

能处理消息映射的类必须从CCmdTarget 类派生。

在讨论了消息的分类之后,应该是讨论各类消息如何处理的时候了。

但是,要知道怎么处理消息,首先要知道如何映射消息。

MFC消息映射的实现方法MFC使用ClassWizard帮助实现消息映射,它在源码中添加一些消息映射的内容,并声明和实现消息处理函数。

现在来分析这些被添加的内容。

在类的定义(头文件)里,它增加了消息处理函数声明,并添加一行声明消息映射的宏DECLARE_MESSAGE_MAP。

在类的实现(实现文件)里,实现消息处理函数,并使用IMPLEMENT_MESSAGE_MAP宏实现消息映射。

一般情况下,这些声明和实现是由MFC的ClassWizard自动来维护的。

看一个例子:在AppWizard产生的应用程序类的源码中,应用程序类的定义(头文件)包含了类似如下的代码://{{AFX_MSG(CTttApp)afx_msg void OnAppAbout();//}}AFX_MSGDECLARE_MESSAGE_MAP()应用程序类的实现文件中包含了类似如下的代码:BEGIN_MESSAGE_MAP(CTApp, CWinApp)//{{AFX_MSG_MAP(CTttApp)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)//}}AFX_MSG_MAPEND_MESSAGE_MAP()头文件里是消息映射和消息处理函数的声明,实现文件里是消息映射的实现和消息处理函数的实现。

它表示让应用程序对象处理命令消息ID_APP_ABOUT,消息处理函数是OnAppAbout。

为什么这样做之后就完成了一个消息映射?这些声明和实现到底作了些什么呢?接着,将讨论这些问题。

在声明与实现的内部DECLARE_MESSAGE_MAP宏:首先,看DECLARE_MESSAGE_MAP宏的内容:#ifdef _AFXDLL#define DECLARE_MESSAGE_MAP()private:static const AFX_MSGMAP_ENTRY _messageEntries[];protected:static AFX_DATA const AFX_MSGMAP messageMap;static const AFX_MSGMAP* PASCAL _GetBaseMessageMap();virtual const AFX_MSGMAP* GetMessageMap() const;#else#define DECLARE_MESSAGE_MAP()private:static const AFX_MSGMAP_ENTRY _messageEntries[];protected:static AFX_DATA const AFX_MSGMAP messageMap;virtual const AFX_MSGMAP* GetMessageMap() const;#endifDECLARE_MESSAGE_MAP定义了两个版本,分别用于静态或者动态链接到MFC DLL的情形。

BEGIN_MESSAE_MAP宏然后,看BEGIN_MESSAE_MAP宏的内容:#ifdef _AFXDLL#define BEGIN_MESSAGE_MAP(theClass, baseClass)const AFX_MSGMAP* PASCAL theClass::_GetBaseMessageMap(){ return &baseClass::messageMap; }const AFX_MSGMAP* theClass::GetMessageMap() const{ return &theClass::messageMap; }AFX_DATADEF const AFX_MSGMAP theClass::messageMap ={ &theClass::_GetBaseMessageMap, &theClass::_messageEntries[0] };const AFX_MSGMAP_ENTRY theClass::_messageEntries[] ={#else#define BEGIN_MESSAGE_MAP(theClass, baseClass)const AFX_MSGMAP* theClass::GetMessageMap() const{ return &theClass::messageMap; }AFX_DATADEF const AFX_MSGMAP theClass::messageMap ={ &baseClass::messageMap, &theClass::_messageEntries[0] };const AFX_MSGMAP_ENTRY theClass::_messageEntries[] ={#endif#define END_MESSAGE_MAP(){0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 }};对应地,BEGIN_MESSAGE_MAP定义了两个版本,分别用于静态或者动态链接到MFC DLL的情形。

相关文档
最新文档