03 MFC与消息映射
mfc消息映射和消息处理
映射宏把一个Windows 消息和其消息处理函数联 映射宏把一个 Windows消息和其消息处理函数联 结起来。 结起来。
►在类的实现源文件中用
BEGIN_MESSAGE_MAP(derived class) 和
class,base
END_MESSAGE_MAP()宏来定义消息映射 END_MESSAGE_MAP()宏来定义消息映射。 宏来定义消息映射。
回顾
利用应用程序向导(AppWizard)工具 利用应用程序向导(AppWizard)工具 可以建立哪3 可以建立哪3种类型的应用程序? 应用程序向导生成了哪些文件? 如何使用classwizard向导? 如何使用classwizard向导?
如何添加一个成员变量? 如何添加一个成员函数? 如何添加一个新类? 如何添加消息响应函数?
2. 命令消息
3. 控件通知消息
消息映射及消息响应
► MFC 采 用 消 息 映 射 ( Message
பைடு நூலகம்
Map ) 机 制 取 代 结构来处理消息。 C/C++语言中的 C/C++语言中的switch-case结构来处理消息。 语言中的switch-case结构来处理消息
► MFC消息映射机制包括一组消息映射宏。一条消息 MFC消息映射机制包括一组消息映射宏。 消息映射机制包括一组消息映射宏
// 用户自定义的消息映射宏
. . . . . . //}}AFX_MSG_MAP END_MESSAGE_MAP()
注意: 注意 : 特殊注解“//{{AFX_MSG_MAP”是ClassWizard类 向导用于维护消息映射宏的标记,用户不要删除注解轻易 修改注解内的代码。
4. 用户自定义消息
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中的消息映射作者:未知文章来源:网络引言:众所周知,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打头但有时我们可能想用一个消息处理函数来处理一批消息。
VC03 MFC概述
5.1 MFC概述微软基本类库MFC(Microsoft Foundation Class)是微软公司为Windows程序员提供的一个面向对象的Windows编程接口,它大大简化了Windows编程工作。
使用MFC类库进行Windows应用程序开发具有很大的优越性。
首先,MFC提供了一个标准化的结构,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是“站在巨人肩膀上”,从一个比较高的起点编程,因而节省了大量的时间;其次,它提供了大量现成的代码,并通过向导(应用程序向导AppWizard和类向导ClassWizard)指导用户编程时实现某些技术和功能。
MFC类库充分利用了Microsoft开发人员多年开发Windows程序的经验,并可以将这些经验融入到你自己开发的应用程序中去。
对用户来说,用MFC开发的最终应用程序具有标准的、熟悉的Windows界面,这样的应用程序易学易用;另外,新的应用程序还能立即支持所有标准Windows特性,而且是用普通的、明确定义的形式。
事实上,也就是在Windows应用程序界面基础上定义了一种新的标准——MFC标准。
早期,在开发Windows应用程序时必须使用微软的SDK,直接调用Windows API函数。
由于Windows API的数目非常多,编写Windows应用程序不仅需要记住很多API函数,而且要小心谨慎地处理程序中的每一个细节。
MFC按照面向对象的原理把这些浩繁的Windows API按逻辑组织起来,使它们具备了抽象化、封装、多态性和模块化的性质。
1989年,微软建立了Application Framework(AFX)小组,负责开发和Borland公司的应用程序框架OWL(Object Windows Language)相类似的应用程序框架。
OWL是Borland 公司为Windows程序员开发的一个类库,在当时非常成功。
AFX小组最初的目标是利用最新的面向对象的技术来开发用于编写Windows GUI程序的工具和类库。
MFC原理结构说明
MFC原理结构说明MFC(Microsoft Foundation Classes)是一种在Windows平台上开发图形用户界面(GUI)的框架。
MFC提供了一组类、函数和宏,用于简化Windows应用程序开发过程。
本文将对MFC的原理和结构进行详细说明。
一、MFC的原理1. 类与对象:MFC使用面向对象的编程模型,所有的窗口、控件、消息处理程序等都是通过类来定义和创建的。
每个MFC应用程序都包含一个CWinApp类的对象,这个对象是整个应用程序的入口点。
2. 消息映射机制:在MFC中,消息是Windows事件的一种表示。
MFC使用消息映射机制来处理这些消息。
消息映射机制是程序员在类中定义的一种技术,它将特定消息与对应的消息处理函数关联起来。
当收到消息时,MFC会自动调用相应的消息处理函数进行处理。
3. 消息与事件:在MFC中,消息是Windows事件的抽象表示,而事件是用户界面中的交互行为。
MFC提供了一系列预定义的消息类型,如鼠标点击、按键、窗口关闭等,程序员只需要在类中覆盖对应的消息处理函数,就可以处理这些消息。
4. 窗口类和控件类:在MFC中,窗口类和控件类是界面元素的基础。
MFC提供了一组窗口类(如CWnd、CFrameWnd)和控件类(如CButton、CEdit),程序员可以通过继承这些类来创建自定义的窗口和控件。
5. 文档视图模型:MFC中引入了文档视图模型(Document-View Model)的概念,用于实现应用程序的数据和界面的分离。
文档类(CDocument)管理应用程序的数据,视图类(CView)用于显示数据,而框架窗口类(CFrameWnd)则用于协调文档和视图之间的交互。
二、MFC的结构1. 应用程序类(CWinApp):应用程序类是MFC应用程序的入口点,它派生自CWinApp类。
应用程序类负责初始化应用程序的环境,包括注册窗口类、创建主窗口、加载并运行消息循环等。
mfc原理和消息映射
MFC思想win32程序中创建一个窗口的过程:设计窗口阶段(由WNDCLASS结构描述部分)、窗口的注册及创建显示过程、消息循环部分。
win32用标准的C语言代码实现,是面向过程的。
在MFC中采用了面向对象的思想,即用面向对象的C++思想对以上代码进行了封装,也就是说将一些对窗口进行操作的API的函数封装到了一个类中,以下我将用简短的代码来演示一下这个过程:class CWnd{public:HWND m_hWnd;BOOL Create();BOOL ShowWindow();};BOOL CWnd::Create(){WNDCLASS wndClass;wndClass.style=CS_HREDRAW;wndClass.lpfnWndProc=(WNDPROC)DefWndProc;wndClass.cbClsExtra=0;wndClass.cbWndExtra=0;wndClass.hInstance=hInstance;wndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));wndClass.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1));LOGBRUSH lgbr;lgbr.lbStyle=BS_SOLID;lgbr.lbColor=RGB(192,192,0);lgbr.lbHatch=0;wndClass.hbrBackground=CreateBrushIndirect(&lgbr);wndClass.lpszMenuName=NULL;wndClass.lpszClassName="mycls";RegisterClass(&wndClass);HWND hWnd;m_hWnd=CreateWindow("mycls","窗口标题",WS_OVERLAPPEDWINDOW,0,NULL,NULL,hInstance,NULL);if(m_hWnd!=NULL)return true;elsereturn false;}BOOL CWnd::ShowWindow(){return ShowWindow(hWnd,nCmdShow);}为了保证代码和以前的执行方式一样,Winmain()函数可以写成如下形式:int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){CMyWnd m_wnd;m_wnd.Create();m_wnd.ShowWindow();MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return true;}此时,如果再写一个新的类来对剩下的代码进行封装,代码如下:class CWinApp{public:CWnd * m_pMainWnd;BOOL InitInstance();BOOL Run();CWinApp ();};CWinApp:: CWinApp (){if(InitInstance())Run();}BOOL CWinApp::InitInstance(){CWnd m_wnd;m_pMainWnd=&m_wnd;m_pMainWnd->Create();m_pMainWnd->ShowWindow();return true;}BOOL CWinApp::Run(){MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return true;}CWinApp theApp;int PASCAL WinMain() {}Windows消息的产生:1用户按键或者鼠标操作可以产生消息,如WM_KEYDOWN,WM_LBUTTONDOWN等;2系统可以自己产生消息,如,创建窗口的时候会产生WM_CREATE,WM_TIMER等;3应用程序间可以定义自己的消息,在应用程序间进行消息通讯;Windows消息的分类:1窗口消息(Windows Message):通常跟窗口的移动、创建,关闭等操作有关。
MFC六大核心机制
MFC六大核心机制1.消息映射机制:MFC使用明确的消息映射机制来处理用户界面和系统事件。
应用程序通过重写消息映射函数来处理不同的消息事件,如鼠标点击、按键操作等。
消息映射机制使得开发者可以方便地响应和处理不同的用户交互动作。
2. 文档视图(Doc/View)体系:MFC采用了文档视图体系,将应用程序数据(文档)和用户界面(视图)分离。
文档表示应用程序的数据,视图代表用户界面,通过文档视图模式可以实现多视图的显示和操作。
开发者可以自定义文档类和视图类,通过它们来管理和展示数据。
3.对象序列化机制:对象序列化是指将对象的状态转换为可以存储或传输的格式,以便于在不同的环境中恢复对象的状态。
MFC提供了强大的对象序列化支持,可以方便地对应用程序的数据进行存储和加载。
开发者只需将需要序列化的成员变量标记为可序列化,并实现相关的序列化函数即可实现数据的持久化。
4.多线程支持:MFC提供了多线程支持,使得应用程序可以在多个线程中同时执行任务。
开发者可以使用MFC提供的线程类来创建和管理线程,并通过消息机制进行线程间的通信。
多线程支持有助于提高应用程序的性能和响应能力。
MFC的运行时类是一组用于封装常用功能的类,包括字符串操作、容器类、文件I/O等。
这些类提供了方便、高效的操作接口,减少了开发者对底层操作的依赖。
开发者可以直接使用MFC提供的运行时类来简化开发过程。
6.扩展性:MFC提供了丰富的扩展性机制,包括自定义控件、自定义对话框、自定义视图等。
开发者可以通过派生已有的MFC类来创建自定义的控件或界面,以满足特定的应用程序需求。
扩展性机制使得开发者可以充分发挥自己的创造力和想象力,实现更加个性化的应用程序。
总结:MFC六大核心机制为开发者提供了丰富的类和功能,使得开发Windows图形界面应用程序更加简单和高效。
通过消息映射机制、文档视图体系、对象序列化机制、多线程支持、运行时类和扩展性机制,开发者可以轻松地实现各种应用程序的需求,并提供更好的用户体验。
消息映射 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消息映射及消息处理函数原型
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消息映射机制在前面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中处理消息的顺序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消息,允许设置窗口的最大或者最小尺寸。
关于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基础类简介与消息映射1、CObject类CObject是大多数MFC类的根类或基类。
CObject类有很多有用的特性:对运行时类信息的支持,对动态创建的支持,对串行化的支持,对象诊断输出,等等。
MFC从CObject派生出许多类,具备其中的一个或者多个特性。
程序员也可以从CObject类派生出自己的类,利用CObject类的这些特性。
这里将讨论MFC如何设计CObject类的这些特性。
首先,考察CObject类的定义,分析其结构和方法(成员变量和成员函数)对CObject特性的支持。
然后,讨论CObject特性及其实现机制。
1.CObject的结构以下是CObject类的定义:class CObject{public://与动态创建相关的函数virtual CRuntimeClass* GetRuntimeClass() const;析构函数virtual ~CObject(); // virtual destructors are necessary//与构造函数相关的内存分配函数,可以用于DEBUG下输出诊断信息void* PASCAL operator new(size_t nSize);void* PASCAL operator new(size_t, void* p);void PASCAL operator delete(void* p);#if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT)void* PASCAL operator new(size_t nSize, LPCSTR lpszFileName,int nLine);#endif//缺省情况下,复制构造函数和赋值构造函数是不可用的//如果程序员通过传值或者赋值来传递对象,将得到一个编译错误protected://缺省构造函数CObject();private://复制构造函数,私有CObject(const CObject& objectSrc); // no implementation//赋值构造函数,私有void operator=(const CObject& objectSrc); // no implementation// Attributespublic://与运行时类信息、串行化相关的函数BOOL IsSerializable() const;BOOL IsKindOf(const CRuntimeClass* pClass) const;// Overridablesvirtual void Serialize(CArchive& ar);// 诊断函数virtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;// Implementationpublic://与动态创建对象相关的函数static const AFX_DATA CRuntimeClass classCObject;#ifdef _AFXDLLstatic CRuntimeClass* PASCAL _GetBaseClass();#endif};由上可以看出,CObject定义了一个CRuntimeClass类型的静态成员变量:CRuntimeClass classCObject还定义了几组函数:构造函数析构函数类,诊断函数,与运行时类信息相关的函数,与串行化相关的函数。
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教程(4)-- 消息映射的实现
MFC教程(4)-- 消息映射的实现(1)消息映射的实现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。
但是在当前例子中,当前对象的类CTview没有覆盖该函数,所以CWnd的WindowProc被调用。
MFC消息映射机制详解
MFC消息映射机制详解分类: MFC2010-04-18 02:22 3322人阅读评论(0) 收藏举报Windows程序和MFC程序是靠消息驱动的,他们对于消息的处理本质上是相同的。
只是Windows程序对于消息处理的过程十分清晰明了,MFC程序则掩盖了消息处理的过程,以消息映射的方式呈现在开发者面前,使得开发消息的处理十分简单。
用多了mfc就想对它的消息映射机制有一个本质的了解,下面将对消息映射做详细的分析。
当然,在分析MFC消息映射之前首先对Windows程序的消息处理过程进行一个简单的描述。
1、Windows应用程序消息处理Windows程序都维护有自己的消息队列,保存了队列消息(当然也有非队列消息,它们直接发给窗口),并用过消息循环对消息进行处理。
消息循环首先通过GetMessage取得消息并从队列中移走,对于加速键会调用TranslateAccelerator函数,对其进行翻译和处理,如果处理成功就不在调用TranslateMessage。
如果不是加速键,就进行消息的转换和派发,让目的窗口的窗口过程来处理消息。
示例代码:[cpp] view plaincopyprint?1.// 主消息循环:2.while (GetMessage(&msg, NULL, 0, 0))3.{4.if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))5.{6.TranslateMessage(&msg);7.DispatchMessage(&msg);8.}9.}真正处理消息的是所谓的窗口过程(LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)),这个函数的参数记录了过程对应的窗口、消息的ID以及参数,在其内部开发者可以实现自己需要的消息处理功能。
面向对象技术中的名词解释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的消息映射转自:/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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• CTypePointerArray
MFC应用程序框架结构 3 MFC应用程序框架结构
MFC的应用程序框架优点: 的 优点: 优点
MFC按照C++类的层次形式组织在一起, 类封装了Windows API函数并提供Windows应用程序常见任务的缺省处理代码。 几个基类提供一般功能,由基类派生的类实现更具体的行为。 MFC提供了文档和视图模型以实现数据和显示的分离。文档 类(Document)用来维护、管理数据,包括数据的读取、存 储与修改;视图类(View)用来接收并显示数据,将这些数 据交给文档类来处理。 MFC库提供了自动消息处理功能。MFC的框架结构通过消息 映射机制,将Windows消息直接映射到—个成员函数进行处理, 简化了消息的处理方式。
MyHello应用程序 MyHello应用程序 • 编译运行 编译: “Build/Build MyHello.exe” 运行:“Build/Execute MyHello.exe” • 关闭:关闭运行窗口
MyHello应用程序分析 MyHello应用程序分析 打开“Workspace”窗口中的”Class View( 类视 图),MFC生成5个类 CAboutDlg CMainFrame CMyHelloApp CMyHelloDoc CMyHelloView 对于每个类MFC生成两个文件: .h:定义了类和它的各种变量、函数原形; .cpp:生成类对象、实现这个类的函数体。
窗口消息、命令消息、控件通知消息的消息映射项不同
VC中存在几种系统定义的消息分类,不同的前缀符号经常用于消息 中存在几种系统定义的消息分类, 中存在几种系统定义的消息分类 宏识别消息附属的分类,系统定义的消息宏前缀如下: 宏识别消息附属的分类,系统定义的消息宏前缀如下: BN CBN DN EN LBN SBN WM 按钮控制消息 组合框控制消息 默认下压式按钮控制消息 编辑控制消息 列表框控制消息 滚动条控制消息 窗口消息 窗口管理消息 初始化消息 输入消息 系统消息 剪贴板消息 控制处理消息 控制通知消息 滚动条通知消息 非用户区消息 MDI消息 消息 DDE消息 消息 应用程序自定义的消息
MyHello应用程序分析 MyHello应用程序分析 预编译头文件stdafx.h 预编译头文件stdafx.h: stdafx.h
用于建立一个预编译的头文件MyHello.pch和一个预定义 的类型文件stdafx.obj,加速编译过程。 资源文件:Resource.h MyHello.ioc:应用程序的图标 MyHello.rc2:不可直接编辑的资源 Toolbar.bmp:工具栏用到的位图资源 MyHelloDov.ico:生成文档的图标 ReadMe.txt
MFC编程基础 第3章 C类库简介 • MFC中类的层次结构 • MFC应用程序框架
• 利用AppWizard生成MFC应用程序
• MFC的消息处理
MFC简介 1 MFC简介
• 类库是一个可以在应用程序中使用的相互关联的类的集合。 • MFC库——Microsoft 基本类库是一个Windows应用程序 框架,它把传统的Windows编程规范中的大多数内容封 装成为各种类,它定义了应用程序的结构,并实现了标准 的用户接口,提高了编程效率 –可以管理窗口、菜单、对话框,实现基本的输入/输出 和数据存储。
AfxWinMain函数
pApp->InitApplication();
pApp- >InitInstance()
pApp- >Run()
结束
利用AppWizard生成MFC AppWizard生成MFC应用程序 3 利用AppWizard生成MFC应用程序
• 创建工程 创建工程:用VisualC++的MFC AppWIzard 创建应用程序的基本框架 • 可视化设计 可视化设计:用VC++ 自带的工具软件 Wizards,制作Windows风格的图形用户界面和 各种控件。 • 编写程序代码 编写程序代码:用MFCClassWizard添加消息 相应函数,然后编写函数代码。
• WinMain()函数,隐藏在应用程序框架中; WinMain()函数,隐藏在应用程序框架中 函数 • 应用程序类(如CMyHelloApp),该类的每个对象代表一 应用程序类( CMyHelloApp),该类的每个对象代表一 App), 个应用程序,程序中默认定义一个全局CMyHelloApp CMyHelloApp对 个应用程序,程序中默认定义一个全局CMyHelloApp对 象即theApp theApp; 象即theApp; • 应用程序启动WinMain()寻找由CWinApp派生出的全 应用程序启动WinMain()寻找由CWinApp派生出的全 WinMain()寻找由CWinApp 局构造的应用程序对象; 局构造的应用程序对象; • 成员函数:CMyHelloApp::InitInstance(),调用所需的构 成员函数:CMyHelloApp::InitInstance(),调用所需的构 :CMyHelloApp::InitInstance(), 造并显示应用程序的主框架窗口; 造并显示应用程序的主框架窗口; • 成员函数:CWinApp::Run(),隐藏在基类中,发送应用程 成员函数:CWinApp::Run(),隐藏在基类中, :CWinApp::Run(),隐藏在基类中 序的消息到窗口,保持应用程序的正常运行; 序的消息到窗口,保持应用程序的正常运行;
MyHello应用程序 MyHello应用程序
• 创建工程
“File/New/Project/MFC AppWizard(exe)” Project name:”MyHello”;Location:”d:\MyVC” 根据向导选择: Single document 中文[中国] None 其它接受默认设置,最后单击“ Finish”,显示 “New Project Information”窗口。
CDocument
CWinApp
应用程序类 框架窗口类
文档类 视图类
非CObject派生类
• 通用工具类
– CString – CTime – CRect – Cpoint – CSize
• MFC支持类
– CArchive – CDumpContext – CRuntimeClass – CFileStatus – CMemoryState
MyHello应用程序分析 MyHello应用程序分析
CMyHelloView类 CMyHelloView类:
派生于MFC的CView类,作用是管理视图窗口,它对应 的对象在框架窗口中实现用户数据的显示和打印。
MyHelloView.h:声明了三个函数用于实现数据打印
OnPreparePrinting()/ OnBeginPrinting()/ OnEndPrinting()。 GetDocument():返回CMyHelloDoc指针,获取文档 指针 OnDraw():实现视图数据的显示和刷新。
CWinApp *pApp=AfxGetApp();
初始化全局对象theApp
CHelloApp类构造函数 调用ProcessShellCommand() 创建主框架窗口对象、视 图对象、文档对象,创建 主框架窗口和视图窗口并 显示 CWinThread::Run() WM_QUIT 消息 循 环
WinMain
MFC消息处理 4 MFC消息处理
• MFC应用程序与其他任何 Windows 程序一样,也使用消息 驱动机制,但 MFC 提供的消息处理机制使得消息的处理更 加容易。 • MFC中消息可以分为三类:
– Windows 消息(窗口消息):包括以 WM_开头的消息,但 WM_COMMAND 除外。Windows消息由窗口和视图处理。 这种消息通常附带一些参数传递给处理函数,这些参数为处理 函数正确地处理消息提供了必要的信息。 – 控件通知消息 控件通知消息:当控件的状态发生改变(例如用户利用控件进行 输入)时,控件就会向其父窗口发送控件通知消息。MFC对控件 通知消息的传递方式与其他以WM_开头的 Windows 消息一样, 但 BN_CLICKED 是个例外,该消息的传递方式与命令消息的传 递机制一样。 – 命令消息 命令消息:包括来自于菜单、工具栏中的按钮和加速键等用户 界面对象的WM_COMMAND 通知消息。
MyHello应用程序分析 MyHello应用程序分析
CMyHelloDoc类 CMyHelloDoc类:
派生于MFC的CDocument类,作用是存放应用程 序的数据以及文件的保存加载功能。文档类要通过 视图类来实现与用户的交互。
CMyHelloDoc.h:声明了三个主要函数
OnNewDocument()用于初始化文档 Serialize()串行化(保存和装入)文档 Dump()用于调试诊断。
应用程序的运行机制
•
MFC应用程序有自己特殊的运行机制,下面以WinHello MFC应用程序有自己特殊的运行机制,下面以WinHello 应用程序有自己特殊的运行机制 程序为例,列出应用程序的执行过程。 程序为例,列出应用程序的执行过程。
CHelloApp theApp
程序开始 CWinApp类构造函数
• CMainFrame类,其对象代表应用程序的主框架窗口; CMainFrame类 其对象代表应用程序的主框架窗口;
• CDocument/CView类,应用程序框架的核心。MFC CDocument/CView类 应用程序框架的核心。 通过"文档一视图" 通过"文档一视图"结构为应用程序提供一种将数据与视 图相分离的存储方式。 图相分离的存储方式。 –文档类的作用是将应程序的数据保存在文档类对象 文档类的作用是将应程序的数据保存在文档类对象 以及从磁盘文件中读或向磁盘文件中写数据。 中,以及从磁盘文件中读或向磁盘文件中写数据。 –视图类的作用是显示数据和编辑数据。 视图类的作用是显示数据和编辑数据。 视图类的作用是显示数据和编辑数据 • 关闭应用程序