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(Microsoft Foundation Class)是一种面向对象的Windows应用程序框架,它是微软公司在Windows操作系统下的视窗类库,是Visual C++的一些类和函数的集合。
MFC的作用是提供一种高级的、面向对象的编程结构,让程序员更加容易地开发Windows应用程序。
下面是一些常用的MFC函数及其详解:1. AfxMessageBox函数原型:int AfxMessageBox(LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0);函数作用:显示一个消息框,包含文本、标题和按钮。
参数解释:lpszText:要显示的消息文本。
nType:消息框类型,包括按钮以及图标等样式。
nIDHelp:帮助ID,用于消息框的帮助文件。
返回值:用户选择的按钮行为,如“取消”、“确定”等。
2. AfxGetMainWnd函数原型:CWnd* AfxGetMainWnd( );函数作用:获取当前线程的主窗口对象指针。
参数解释:无。
返回值:当前线程的主窗口对象指针。
3. CString.Format函数原型:int Format(LPCTSTR lpszFormat, ...);函数作用:根据格式控制符格式化字符串。
参数解释:lpszFormat:格式化字符串,格式控制符用“%”标识。
...:格式控制符中各个参数的值。
返回值:格式化后的字符串长度。
4. CListBox.SetCurSel函数原型:int SetCurSel(int nIndex);函数作用:设置列表框中当前选定项的索引。
参数解释:nIndex:要选定项的索引,从0开始。
返回值:如果设置成功,则返回新选定项的索引;否则,返回LB_ERR。
5. CEdit.SetWindowText函数原型:void SetWindowText(LPCTSTR lpszString); 函数作用:设置编辑框的文本内容。
MFC消息处理函数总结解读
MFC消息处理函数总结解读MFC(Microsoft Foundation Classes)是Windows编程中常用的框架之一,它提供了一组面向对象的类库,帮助开发人员更轻松地构建Windows应用程序。
在MFC中,消息处理函数是非常重要的一部分,它们用于处理窗口消息,包括按键事件、鼠标事件等,可以响应用户的操作。
消息处理函数的基本格式如下:```afx_msg LRESULT OnMessage(WPARAM wParam, LPARAM lParam);```其中afx_msg是一个宏定义,用于指示该函数为一个MFC消息处理函数。
LRESULT是一个32位整数,用于返回消息处理结果。
OnMessage是函数名,可以根据实际需求进行命名。
wParam和lParam是消息的参数,根据不同的消息类型可以传递不同的值。
下面是对常见的消息处理函数的解读。
1. OnCreateOnCreate消息处理函数在窗口创建时被调用,可以进行一些初始化操作。
例如创建子窗口、加载资源等。
可以通过返回-1来取消窗口的创建。
2. OnDestroyOnDestroy消息处理函数在窗口销毁时被调用,可以进行一些资源的释放操作。
例如关闭文件、释放内存等。
3. OnPaintOnPaint消息处理函数在窗口需要重绘时被调用,可以进行绘图操作。
通常会使用GDI(图形设备接口)函数进行绘图,例如绘制文本、绘制图形等。
4. OnSizeOnSize消息处理函数在窗口大小改变时被调用,可以根据新的窗口大小进行调整。
例如重新设置子窗口的位置和大小。
5. OnKeyDownOnKeyDown消息处理函数在键盘按键被按下时被调用,可以响应用户的按键操作。
可以根据不同的按键进行不同的处理,例如响应回车键、删除键等。
6. OnMouseMoveOnMouseMove消息处理函数在鼠标移动时被调用,可以获取鼠标的当前位置。
可以根据鼠标位置进行一些操作,例如绘制跟随鼠标的图形、显示鼠标所在位置的坐标等。
mfc 信息机制
mfc 信息机制MFC信息机制MFC(Microsoft Foundation Class)是微软公司推出的一套用于Windows操作系统的C++类库,它为开发者提供了丰富的工具和组件,用于快速构建Windows应用程序。
在MFC中,信息机制是其重要特性之一,它提供了一种方便的方式来管理和传递应用程序中的消息。
一、消息机制的基本概念在MFC中,消息是指应用程序中发生的各种事件,比如鼠标点击、键盘输入、窗口关闭等。
消息机制是指MFC框架中的一套机制,用于处理和分发这些消息。
消息的处理过程包括两个关键组件:消息映射和消息处理函数。
1. 消息映射消息映射是指将消息和消息处理函数进行关联的过程。
通过在类的消息映射表中添加相应的消息和处理函数的映射关系,可以告诉MFC框架在收到某个消息时应该调用哪个函数进行处理。
消息映射表一般定义在类的声明中,使用宏来声明消息映射表的内容。
2. 消息处理函数消息处理函数是指用于处理特定消息的函数。
当MFC框架收到某个消息时,会根据消息映射表中的映射关系调用相应的消息处理函数。
消息处理函数可以是类的成员函数,也可以是全局函数,具体取决于消息映射表中的声明方式。
二、消息机制的应用场景消息机制在MFC中广泛应用于用户界面的交互和事件响应。
通过消息机制,开发者可以方便地处理用户的操作和系统的事件,实现各种功能和交互效果。
1. UI事件响应在MFC应用程序中,用户通过与界面上的控件进行交互来触发各种事件,比如按钮点击、菜单选择等。
通过消息机制,我们可以将这些事件与相应的处理函数进行关联,当用户触发某个事件时,可以执行相应的处理逻辑。
2. 窗口消息处理MFC中的窗口是指用户界面上的各种窗口元素,比如对话框、窗口、视图等。
窗口消息是指与窗口相关的各种事件,比如窗口创建、大小改变、关闭等。
通过消息机制,我们可以对窗口消息进行处理,实现窗口的初始化、布局、关闭等功能。
3. 自定义消息除了系统定义的消息类型,MFC还支持自定义消息。
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消息机制详解
消息映射的实现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结构。
MFC——4个基本类中的成员函数介绍
MFC——4个基本类中的成员函数介绍MFC(Microsoft Foundation Classes)是一种用于Windows操作系统的面向对象的应用程序框架,它是基于C++编程语言编写的,用于简化Windows应用程序的开发过程。
在MFC中,有四个基本类,它们分别是CWinApp类、CFrameWnd类、CView类和CWinThread类。
下面将对这四个类的成员函数进行详细介绍。
一、CWinApp类CWinApp类是MFC应用程序的基类,它提供了一些重要的成员函数,用于初始化和管理应用程序的行为和资源。
以下是CWinApp类的几个主要成员函数:1. InitInstance函数:该函数用于对应用程序进行初始化设置。
在该函数中,通常会创建主窗口,加载资源以及执行其他必要的初始化操作。
该函数需要被子类重写来实现具体的初始化逻辑。
2. ExitInstance函数:该函数用于退出应用程序。
在该函数中,通常会执行一些释放资源的操作,例如关闭文件、释放内存等。
该函数可以被子类重写以实现一些额外的清理工作。
3. OnIdle函数:该函数是用于应用程序的空闲处理。
当应用程序没有其他事件要处理时,就会调用这个函数。
在该函数中可以执行一些耗时的操作,例如更新界面、处理后台任务等。
二、CFrameWnd类CFrameWnd类是MFC框架中的窗口类,用于创建和管理应用程序的主窗口。
以下是CFrameWnd类的几个常用成员函数:1. Create函数:该函数用于创建一个顶级窗口。
它根据指定的参数创建窗口,并将窗口与指定的窗口类相关联。
2. OnCreate函数:该函数在创建窗口后被调用。
它通常用于添加和初始化窗口的子控件,例如按钮、菜单等。
三、CView类CView类是MFC框架中的视图类,用于显示应用程序的数据。
以下是CView类的几个常用成员函数:1. OnDraw函数:该函数用于绘制视图的内容。
在该函数中,通常会使用GDI(图形设备接口)函数来绘制图形、文字等。
mfc消息响应机制
mfc消息响应机制MFC消息响应机制MFC(Microsoft Foundation Class)是微软公司为开发Windows应用程序而提供的一组C++类库。
在MFC中,消息响应机制是一种重要的编程方式,用于处理用户与应用程序之间的交互。
本文将详细介绍MFC消息响应机制的原理和使用方法。
一、消息处理函数在MFC中,消息处理函数是用于响应消息的函数。
当用户与应用程序进行交互时,系统会产生相应的消息,然后通过消息映射表找到对应的消息处理函数进行处理。
消息处理函数是类成员函数,其原型通常为:afx_msg LRESULT OnMessage(WPARAM wParam, LPARAM lParam);其中,afx_msg是MFC宏定义,LRESULT是消息处理函数的返回值类型,OnMessage是函数名,WPARAM和LPARAM是消息参数,用于传递消息的附加信息。
二、消息映射表消息映射表是一个包含消息处理函数与消息ID之间对应关系的表格。
在MFC应用程序的消息映射表中,每个消息ID都与一个消息处理函数相对应。
当收到某个消息时,系统会根据消息ID查找对应的消息处理函数,并调用该函数进行处理。
消息映射表通常定义在类的声明中,格式如下:BEGIN_MESSAGE_MAP(CMyClass, CBaseClass)ON_MESSAGE(messageID, memberFxn)// more message mappings...END_MESSAGE_MAP()其中,CMyClass是消息处理类的名称,CBaseClass是消息处理类的基类,messageID是消息ID,memberFxn是与该消息ID对应的消息处理函数。
三、消息处理函数的实现消息处理函数的实现步骤如下:1. 在类的声明中定义消息处理函数的原型。
2. 在类的实现文件中,使用宏定义IMPLEMENT_DYNAMIC或IMPLEMENT_DYNCREATE来实现运行时类型信息。
MFC中常用函数
1.IsEmpty()函数判断一对象是否初始化,返回布尔值.表达式 IsEmpty(expression)实例: <%Dim iresponse.write IsEmpty(i)%>返回结果: true2. GetAt函数原型:TCHAR GetAt( int nIndex ) const;函数返回值:字符中第nIndex个字符(从0开始).Header: atlcoll.h注意:nIndex的最大值可由GetUpperBound()得到。
若nIndex小于0或大于最大值,将返回错误。
3. isdigitisdigit原型:extern int isdigit(char c);用法:#include <ctype.h>功能:判断字符c是否为数字说明:当c为数字0-9时,返回非零值,否则返回零。
附加说明此为宏定义,非真正函数。
相关函数:isalnum,isalpha,isxdigit,iscntrl,isgraph,isprint,i spunct,isspace4. isalnum原型:extern int isalnum(int c);用法:#include <ctype.h>功能:判断字符变量c是否为字母或数字说明:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零。
5. isalpha函数:isalpha原型:int isalpha(int ch)用法:头文件加入#include <cctype>(旧版本的编译器使用<ctype.h>)功能:判断字符ch是否为英文字母,当ch为英文字母a-z或A-Z时,在标准c中相当于使用“isupper(ch)||islower(ch)”做测试,返回非零值,否则返回零。
PS:{isupper原型:extern int isupper(int c);头文件:<cctype>(旧版本的编译器使用<ctype.h>) 功能:判断字符c是否为大写英文字母说明:当参数c为大写英文字母(A-Z)时,返回非零值,否则返回零。
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子对话框自定义消息及响应函数在MFC程序中,子对话框是一种非常常用的UI组件,它可以作为主对话框的一个子窗口,用于显示和处理某个特定功能的界面和逻辑。
而在子对话框中,我们经常需要自定义消息和响应函数,以便实现自己的业务需求。
接下来,本文将为大家介绍如何在MFC子对话框中自定义消息和响应函数。
一、什么是自定义消息和响应函数?在MFC程序中,消息是指窗口和控件之间的通讯机制。
当用户执行某些操作时,窗口或控件会向消息队列中发送一条消息,然后消息循环会将这些消息逐个分发给窗口和控件,从而触发相应的事件和动作。
而自定义消息和响应函数,则是指我们可以自己定义一些特定的消息类型和相应的处理函数,从而实现对某些特定事件的处理。
比如,我们可以定义一个自己的WM_MY_MESSAGE消息,然后在子对话框中添加一个响应函数OnMyMessage,当收到这个消息时,就会自动调用该响应函数来处理相应的业务逻辑。
二、如何定义自定义消息和响应函数?在MFC程序中,定义自定义消息和响应函数的步骤如下:1.在resource.h文件中添加自定义消息的宏定义,如下所示:#define WM_MY_MESSAGE (WM_USER+100)其中,WM_USER是一个预定义的消息码,代表用户自定义消息的起始码,因此我们可以在此基础上加上一个任意数字来定义自己的消息码。
2.在子对话框的头文件中声明自定义消息的处理函数,如下所示:afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);其中,afx_msg是一个宏定义,代表该函数是一个MFC消息处理函数,LRESULT是一个预定义的返回值类型,代表消息的处理结果。
3.在子对话框的源文件中实现自定义消息的处理函数,如下所示:LRESULT CMySubDlg::OnMyMessage(WPARAM wParam, LPARAM lParam){// 在这里实现自己的业务逻辑return 0;}其中,CMySubDlg是子对话框的类名,OnMyMessage是自定义消息的处理函数名,wParam和lParam分别代表消息的参数,可以根据具体情况进行解析和使用。
mfc常用类及其成员函数.doc
MFC常用类及其成员函数2009-08-26 16:06CRuntimeClass 结构在CRuntimeClass结构中定义了类名、对象所占存储空间的大小、类的版本号等成员变量及动态创建对象、派牛关系判断等成员函数。
每一个从CObject 类派生的类都有一个CRuntimeClass结构同它关联,以便完成在运行吋得到对象的信息或基类的信息。
要使用CRuntimeClass结构,必须结合使用RUNTIME.CLASS()宏和其他有关运行时类型识别的MFC宏。
CCmdTarget 类(1)消息发送MFC应用程序为每个CCmdTarget派生类创建一个称为消息映射表的静态数据结构,可将消息映射到对象所对应的消息处理函数上。
(2)设置光标BeginWaitCursor ()将光标改为沙漏形状;EndWaitCursor () 将光标改冋到之前的形状;RestoreWaitCursor ()用于将光标还原为等待状态。
(3)支持自动化CCmdTarget类支持程序通过COM接口进行交互操作,自动翻译COM接口的方法。
CWinThread 类由CCmdTarget派生,主要工作是创建和处理消息循环。
CWinApp 类从CWinThread 类派生,成员函数InitApplication()、Initlnstance()、Run()。
在TniLTnstanceO函数中,创建了一个单文档模板类或多文档模板类(CDocTemplate)的对象,并且在文档模板的构造函数屮,系统定义的宏RUNT1ME.CLASS 创建了文档类对象,框架窗口类对象和视图类对象.在MFC应用程序中有且仅有一个CWinApp派生类的对象,代表程序运行的主线程,代表应用程序本身。
CWnd 类由CCmdTargct类直接派生,是MFC中最基本的GUI对彖。
公共变量m_hWnd 用于存放供API函数调用的窗口句柄。
CframeWnd 类从CWnd类派生而来,主要用来掌管一个窗口。
MFC消息处理函数总结解读
1.AfxWndProc( 该函数负责接收消息,找到消息所属的 CWnd 对象,然后调用AfxCallWnd Proc2.AfxCallWndProc( 该函数负责保存消息 (保存的内容主要是消息标识符和消息参数供应用程序以后使用,然后调用 WindowProc(函数3.WindowProc( 该函数负责发送消息到 OnWndMsg(函数,如果未被处理,则调用DefWin dowProc(函数4.OnWndMsg( 该函数的功能首先按字节对消息进行排序, 对于WM_COMMAND消息, 调用 OnCommand(消息响应函数,对于 WM_NOTIFY消息调用 OnNotify(消息响应函数。
任何被遗漏的消息将是一个窗口消息。
OnWndMsg(函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。
如果 OnWndMsg(函数不能找到这样的处理函数的话, 则把消息返回到WindowProc(函数,由它将消息发送给 DefWindowProc(函数 5.OnCommand( 该函数查看这是不是一个控件通知 (lParam参数不为 NULL , 如果 lParam 参数为空的话,说明该消息不是控件通知 ,如果它是, OnCommand(函数会试图将消息映射到制造通知的控件; 如果他不是一个控件通知 (或者如果控件拒绝映射的消息OnCommand(就会调用 OnCmdMsg(函数6.OnCmdMsg( 根据接收消息的类, OnCmdMsg(函数将在一个称为命令传递(Command Ro uting 的过程中潜在的传递命令消息和控件通知。
例如:如果拥有该窗口的类是一个框架类, 则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数MFC 应用程序创建窗口的过程1.PreCreateWindow( 该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数 (可以设置窗口风格等等2.PreSubclassWindow( 这也是一个重载函数,允许首先子分类一个窗口3.OnGetMinMaxInfo( 该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息, 允许设置窗口的最大或者最小尺寸4.OnNcCreate( 该函数也是一个消息响应函数, 响应 WM_NCCREATE消息, 发送消息以告诉窗口的客户区即将被创建5.OnNcCalcSize( 该函数也是消息响应函数 , 响应 WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小6.OnCreate( 该函数也是一个消息响应函数,响应 WM_CREATE消息,发送消息告诉一个窗口已经被创建7.OnSize( 该函数也是一个消息响应函数, 响应 WM_SIZE消息, 发送该消息以告诉该窗口大小已经发生变化8.OnMove( 消息响应函数,响应 WM_MOVE消息,发送此消息说明窗口在移动9.OnChildNotify( 该函数为重载函数, 作为部分消息映射被调用, 告诉父窗口即将被告知一个窗口刚刚被创建MFC 应用程序关闭窗口的顺序 (非模态窗口1.OnClose( 消息响应函数,响应窗口的 WM_CLOSE消息,当关闭按钮被单击的时候发送此消息2.OnDestroy( 消息响应函数,响应窗口的 WM_DESTROY消息,当一个窗口将被销毁时, 发送此消息3.OnNcDestroy( 消息响应函数,响应窗口的 WM_NCDESTROY消息,当一个窗口被销毁后发送此消息4.PostNcDestroy( 重载函数,作为处理 OnNcDestroy(函数的最后动作,被 CWnd 调用MFC 应用程序中打开模式对话框的函数调用顺序1.DoModal( 重载函数,重载 DoModal(成员函数2.PreSubclassWindow( 重载函数,允许首先子分类一个窗口3.OnCreate( 消息响应函数,响应 WM_CREATE消息,发送此消息以告诉一个窗口已经被创建4.OnSize( 消息响应函数,响应 WM_SIZE消息,发送此消息以告诉窗口大小发生变化5.OnMove( 消息响应函数,响应 WM_MOVE消息,发送此消息,以告诉窗口正在移动6.OnSetFont( 消息响应函数,响应 WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体7.OnInitDialog( 消息响应函数, 响应 WM_INITDIALOG消息, 发送此消息以允许初始化对话框中的控件,或者是创建新控件8.OnShowWindow( 消息响应函数, 响应 WM_SHOWWINDOW消息,该函数被ShowWind ow(函数调用9.OnCtlColor( 消息响应函数,响应 WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色10. OnChildNotify( 重载函数,作为 WM_CTLCOLOR消息的结果发送MFC 应用程序中关闭模式对话框的顺序1.OnClose( 消息响应函数,响应 WM_CLOSE消息,当 " 关闭 " 按钮被单击的时候,该函数被调用2.OnKillFocus( 消息响应函数,响应 WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送3.OnDestroy( 消息响应函数,响应 WM_DESTROY消息,当一个窗口即将被销毁时,被发送4.OnNcDestroy( 消息响应函数,响应 WM_NCDESTROY消息,当一个窗口被销毁以后被发送5.PostNcDestroy( 重载函数,作为处理 OnNcDestroy(函数的最后动作被 CWnd 调用打开无模式对话框的顺序1.PreSubclassWindow( 重载函数,允许用户首先子分类一个窗口2.OnCreate( 消息响应函数,响应 WM_CREATE消息,发送此消息以告诉一个窗口已经被创建3.OnSize( 消息响应函数,响应 WM_SIZE消息,发送此消息以告诉窗口大小发生变化4.OnMove( 消息响应函数,响应 WM_MOVE消息,发送此消息以告诉窗口正在移动5.OnSetFont( 消息响应函数,响应 WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体以上这些的执行都是按给定的顺序执行!只有清楚的了解应用程序的执行顺序, 才能在编写代码的时候知道, 在什么时候应该执行什么,以及在什么地方该处理什么!这只是本人总结的一点小小的经验, 希望能对 MFC 的初学者有所帮助! MFC 应用程序中处理消息的顺序1.AfxWndProc( 该函数负责接收消息,找到消息所属的 CWnd 对象,然后调用AfxCallWnd Proc2.AfxCallWndProc( 该函数负责保存消息 (保存的内容主要是消息标识符和消息参数供应用程序以后使用,然后调用 WindowProc(函数3.WindowProc( 该函数负责发送消息到 OnWndMsg(函数,如果未被处理,则调用DefWin dowProc(函数4.OnWndMsg( 该函数的功能首先按字节对消息进行排序, 对于WM_COMMAND消息, 调用 OnCommand(消息响应函数,对于 WM_NOTIFY消息调用 OnNotify(消息响应函数。
深入探讨MFC消息循环和消息泵
深入探讨MFC消息循环和消息泵MFC(Microsoft Foundation Class)是一个用于开发Windows应用程序的C++类库。
在MFC中,消息循环和消息泵是非常重要的概念,它们负责处理和分发用户输入、系统事件等各种消息。
消息循环是一个无限循环,用于接收和分发各种消息。
在应用程序的主线程中,消息循环会不断的从操作系统中获取消息,并调用相应的处理函数来处理消息。
当所有消息处理完毕后,消息循环会继续从操作系统中获取下一个消息。
这个过程会持续进行,直到应用程序退出。
消息泵是消息循环的核心部分,它负责从操作系统获取消息,并将消息添加到消息队列中。
消息泵会不断的从消息队列中取出消息,并将消息发送给对应的窗口的消息处理函数。
在MFC中,消息泵主要由主消息循环函数CWinApp::Run来实现。
CWinApp是一个用于管理应用程序的类,它派生自CWinThread类。
在CWinApp::Run函数中,首先会调用PreMessageLoop函数,对应用程序进行一些初始化操作。
然后,进入消息循环,并依次处理消息。
在每次迭代中,消息泵会不断地从消息队列中取出消息,并将消息发送给对应的窗口进行处理。
处理完当前消息后,消息泵会继续从消息队列中取出下一个消息,并重复以上的操作。
MFC中的消息循环和消息泵机制保证了应用程序能够及时响应用户的输入和系统事件。
当用户在应用程序中进行操作时,比如点击窗口、按下快捷键等,这些操作都会被转化为消息,并通过消息循环和消息泵传递给应用程序进行处理。
应用程序可以根据收到的消息来更新界面、执行相应的功能等。
消息循环和消息泵的深入理解对于开发MFC应用程序非常重要。
在消息循环中,开发者可以插入一些自定义的处理逻辑,比如处理自定义的消息、扩展窗口处理函数等。
在消息泵中,开发者可以了解消息的分发机制,比如哪些消息是窗口消息、哪些消息是系统消息等。
通过对消息循环和消息泵的深入理解,开发者可以更加灵活地控制应用程序的行为,增加应用程序的交互性和可扩展性。
MFC的消息循环
MFC的消息循环MFC的消息循环消息分为队列消息(进⼊线程的消息队列)和⾮队列消息(不进⼊线程的消息队列)。
对于队列消息,最常见的是⿏标和键盘触发的消息,例如WM_MOUSERMOVE,WM_CHAR等消息;还有例如:WM_PAINT、WM_TIMER和WM_QUIT。
当⿏标、键盘事件被触发后,相应的⿏标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消息队列,由Windows系统负责把消息加⼊到相应线程的消息队列中,于是就有了消息循环(从消息队列中读取并派送消息)。
还有⼀种是⾮队列消息,他绕过系统队列和消息队列,直接将消息发送到窗⼝过程。
例如,当⽤户激活⼀个窗⼝系统发送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。
创建窗⼝时发送WM_CREATE消息。
在后⾯你将看到,MS这么设计是很有道理的,以及他的整套实现机制。
这⾥讲述MFC的消息循环,消息泵。
先看看程序启动时,怎么进⼊消息循环的:_tWinMain ->AfxWinMain ->AfxWinInit ->CWinThread::InitApplication ->CWinThread::InitInstance ->CWinThread::Run ⾮对话框程序的消息循环的事情都从这CWinThread的⼀Run开始... 第⼀部分:⾮对话框程序的消息循环机制//thrdcore.cpp// main running routine until thread exitsint CWinThread::Run(){ ASSERT_VALID(this); // for tracking the idle time state BOOL bIdle = TRUE; LONG lIdleCount = 0; // acquire and dispatch messages until a WM_QUIT message is received. for (;;) { // phase1: check to see if we can do idle work while (bIdle && !::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)) { // call OnIdle while in bIdle state if (!OnIdle(lIdleCount++)) bIdle = FALSE; // assume "no idle" state } // phase2: pump messages while available do { // pump message, but quit on WM_QUIT if (!PumpMessage()) return ExitInstance(); // reset "no idle" state after pumping "normal" message if (IsIdleMessage(&m_msgCur)) { bIdle = TRUE; lIdleCount = 0; } } while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)); } //⽆限循环,退出条件是收到WM_QUIT消息。
MFC消息机制
MFC消息机制理解消息循环理解消息循环经及Windows程序整个的消息发送机制对于任何Windows程序都是非常重要也是最根本的.现在我们已经尝试了如何处理消息循环,我们有必要对这整个过程再深入一些.因为假如你不能理解消息循环具体是怎么一回事的话,那么以后你就会越来越糊涂.什么是消息?消息就是一个整型值.如果你查看一下你的头文件的话(当你去调查API的工作机制的话,这是一个非常好的也是大多数人都有的习惯)你就发现下面这些东西:#define WM_INITDIALOG 0x0110#define WM_COMMAND 0x0111#define WM_LBUTTONDOWN 0x0201...等等. 消息是用于底层这个层次上,窗口之间的通信.假如你希望窗口或是控件(其实也是一个特殊的窗口)做某个事情的话,你就发送给它一个消息. 假如有另一个窗口希望你做某个事情的话,它也送一个消息给你.假如有比如像用户敲击键盘,移动鼠标,点击按钮之类的事件发生的话,那么这些消息就由系统发送给那些受到影响的窗口.假如你的窗口是其中的一个的话,你就要处理这个消息,对这个消息做出相应的反应.每个窗口消息都有两个参数,wParam和lParam.最初wParam是16位的,lParam是32位,但是在WIN32中,它们都是32位的.不是每条消息都用到了这些参数,而且不同的消息对它们的使用是不同的.举个例子,WM_CLOSE消息就两个参数都没有用到,你可以把两个都忽略.WM_COMMAND消息就两个参数都用上了,wParam参数包含了两个值,一个是HIWORD(wParam),它是消息的通知码(如果可用的话),另一个是LOWORD(wParam),它是发送消息的控件或是菜单的标识符.lParam是发送消息的控件的HWND(HWND是一种数据类型,也就是窗口的句柄.控件的实质也是一个窗口,因此它也有句柄),当这个消息不是来自于一个控件或是窗口,lParam 的值就是NULL,.(比如当消息是由菜单产生时,lParam就是NULL)HIWORD()和LOWORD()是由windows定义的宏,它们的作用分别是取得一个32位的值的高两个字节(高字)和低两个字节(低字) ,(相当于是将一个双字分别去和0XFFFF0000以及0X0000FFFF作与运算,再分别向右和向左作相应16位位移后得到的结果) 在WIN32中,一个字是16位,一个双字也就是32位了.发送一个消息,你可以用函数PostMessage()或函数SendMessage(). 函数PostMessage()的作用是将消息送到消息队列中,然后立即返回.这意味着,一旦你调用了函数PostMessage()后,那么这个消息有没有得到处理就不一定了.函数 SendMessage()是将消息直接发送给窗口,然后要一直等窗口对这个消息的处理完成了,这个函数才会返回了.假如我们想关闭一个窗口的话,我们可以发送给这个窗口一个WM_CLOSE的消息,比如像这样做: PostMessage(hwnd, WM_CLOSE, 0, 0),那么这个你去点击窗口上方的关闭按钮的效果是一样的.请注意wParam 和 lParam 都是0.原因就正如我们已经谈到的那样,WM_CLOSE消息没有用到这两个参数对话框一旦你开始使用对话框,为了和对话框进行通信,你就会需要发送消息给对话框上的控件.为了做到这一点,你要么用函数GetDlgItem()加上控件的标识符来获得控件的句柄,然后呢,再用函数SendMessage();要么你就用函数SendDlgItemMessage(),这个函数把以上两步结合起来了. 你给这个函数一个窗口的句柄以及子窗口(也就是这个窗口上的控件)的标识符,你就可以获取标识符所对应的子窗口的句柄,接下来就是给子窗口发送消息了.函数SendDlgItemMessage()以及类似的API比如GetDlgItemMessage()可以工作在所有的窗口上,不仅仅是对话框.什么是消息队列让我们假设当你在忙于处理WM_PAINT消息时,突然用户在键盘上敲了一串键.这会发生什么事情呢?你到底是应该停下你的画画,对键盘作出响应,还是对敲下的这些键置之不理呢?显然两种方式都是不合理的.因此我们有了消息队列.当消息被送入消息队列后,你一个个的对它们进行处理,处理一个消息,就移除一个消息.(当然先来的消息先得到处理)这样可以确保存你不会错过哪条消息.当你对某条消息进行处理时,其它消息就等待在队列中,直到你来处理它们.什么是消息循环while(GetMessage(&Msg, NULL, 0, 0) > 0){TranslateMessage(&Msg);DispatchMessage(&Msg);}消息循环调用函数GetMessage(),这个函数它会去察看你的消息队列.假如消息队列是空的(也就是没有任何消息),那么我们的程序就停在那里,等待消息的到来.当某一个导致消息被送到消息队列的事件发生时(举个例子,系统注册的鼠标点击,比如点击关闭按钮),函数GetMessage()就会返回一个正值,表明这里有一个需要得到处理的消息,而且这个消息的值被赋给了我们传递给函数GetMessage()的参数Msg,这个结构体中.如果这个消息是WM_QUIT,那么函数GetMessage()的返回值就是0.如果有错误产生的话,那么返回值就是负值.我们得到消息后(消息在结构体变量Msg中),接下来就可以把消息传递给函数TranslateMessage().这个函数对消息又多做了一步处理,它将虚拟键的消息翻译成字符消息.这一步事实上是可选的,但是如果没有这一步的话,某些事情就不会发生了.一旦这些做完以后,我们把消息传递给函数DispatchMessage(). 函数DispatchMessage()所做的事情就是检查消息是发送哪个窗口的,然后再去查看这个窗口的窗口过程.然后呢,它就会调用这个过程,将参数: 窗口的句柄,消息以及wParam和lParam,送给窗口过程.在你的窗口过程中,你就会检查消息和它的参数,然后根据消息和它的参数,你就可以做你想做的事情了!你不用对所有的消息都进行处理,对于你不想亲自去处理的消息,你就调用函数DefWindowProc()就是了.它会为你对那些没有处理的消息做一些默认的处理.(一般情况下,这个函数其实什么也没有做,也就是相当于将你没有处理的消息忽略掉了,等于那些消息从没有产生过,只是从消息队列中过了一遍.)一旦你做完对消息的处理之后,你的窗口过程就返回了,函数DispatchMessage()也返回了.我们又回到了整个循环的的开始.对于WINDOWS程序,这里有一个非常重要的概念.那就是你的窗口过程不是由系统调用的,事实上是你自己通过调用函数DispatchMessage()间接地调用的. 假如你想自己来调用窗口过程的话(不通过函数DispatchMessage()),你可以把接受消息的窗口,它的窗口句柄作为参数传递给函数GetWindowLong()(函数GetWindowLong()通过设置最后一个参数为GWL_WNDPROC,可以获得窗口过程的地址),这样直接得到窗口的窗口过程,然后再直接执行这个窗口过程!while(GetMessage(&Msg, NULL, 0, 0) > 0){WNDPROC fWndProc = (WNDPROC)GetWindowLong(Msg.hwnd, GWL_WNDPROC);fWndProc(Msg.hwnd, Msg.message, Msg.wParam, Msg.lParam);}我在前面的例程序中尝试了这种作法,而且它确实是可行的.但是这里有许多事情,比如Unicode/ANSI的转换,调用定时器返回等等就不行了,所以呢,你可以试一试,但是不要用在实际的应用中.请注意,我们用函数GetWindowLong()获得和这个窗口相关的窗口过程.为什么不直接调用我们的WndProc()呢?是这样的,我们的消息循环负责我们程序中的所有的窗口,这些窗口包括了比如按钮,列表框之类,它们都有各自的窗口过程.因此我们要确定对不同的窗口我们调用的是相应的窗口过程.因为多个窗口都可以使用相同的窗口过程,第一个参数(窗口的句柄)就用于告诉窗口过程,消息是送给哪个窗口的.正如你所看到的那样,你的应用程序花费了绝大多数的时间在消息循环中往往返返.你非常惬意地发送一条消息给运行得正开心的窗口处理.但是当你想你的窗口退出时,你该怎么做呢?因为我们用的是一个while()循环,假如函数GetMessage()的返回值是0(OK,0),这个循环就结束了.我们也就到达我们的WinMain()的终点了,从而退出程序.这些正是函数PostQuitMessage()完成的事情.它将WM_QUIT消息送到了队列中,和返回一个正值不同,函数GetMessage()填充了Msg结构体,然后返回一个0.在这里Msg结构体的成员wParam包含了你传递给函数PostQuitMessage()的值.你要么将这个值忽略掉,要么把它作为W inMain()的返回值.也就是这个过程终止时的退出码.重要之处: 函数GetMessage()将会返回-1假如它遇到了错误的话.你要记住这一点,不然的话,在某些时候你就会被它拖住的....即使这个函数是定义成返回一个布尔值,它也可以返回除了真或假以外的其它值,因为BOOL布尔型被定义成UINT(无符号整型).下面是例程序代码,它看起来可以运行,但是在某些情况下不能正确处理.while(GetMessage(&Msg, NULL, 0, 0))while(GetMessage(&Msg, NULL, 0, 0) != 0)while(GetMessage(&Msg, NULL, 0, 0) == TRUE)上面的全是错的!你也许注意到了在整个教程中我用的都是第一个,正如我所提到的那样,只要函数GetMessage()的调用不失败的话(前提是你的所有代码都是正确的),它还是可以工作得很好.然而我有一点没有考虑到,那就是当你看到我写的这些文字的时候,你的代码可能在绝大多数的情况下都有错误.还有一点就是函数GetMessage()本身也可能在某些情况下调用失败:) 我会全部检查一遍并且纠正这个错误,但是如果我漏掉了一些的话,就原谅我.while(GetMessage(&Msg, NULL, 0, 0) > 0)上面这个就是对的.要取得相同效果的代码也应该总是这个样子的.我希望你现在对窗口的消息循环有了一个更好的理解,假如不是这样的话,不要灰心,不要害怕,一旦你使用它们一段时间后,所有的事情都会明白的.。
MFC消息机制
MFC消息机制⼀、消息的分类1、队列消息、⾮队列消息l队列消息:windows为每个应⽤程序都建⽴⼀个消息队列,那么通过消息队列,进⾏传送的消息都属于队列消息;⼀般来说,由⿏标、键盘产⽣的消息都属于队列消息。
(为什么呢?想想,⿏标、键盘事件都是由系统捕获的,系统捕获后要传递给应⽤程序,就⼀定的通过消息队列);l⾮队列消息:除了队列消息,剩下的⾃然⽽然就是⾮队列消息了;u队列消息是通过PostMessage()的⽅式投递消息的,这样的消息发送也叫“寄送”,该函数寄送消息即可返回,不需要等待程序处理结果;u⾮队列消息是通过SendMessage()的⽅式进⾏的,这样的消息发送叫“发送”;消息不需要进⼊窗⼝的消息队列,然⽽不管是队列消息,还是⾮队列消息,消息处理的起点都是AfxWndProc。
不同的是队列消息,是操作系统把消息投放到消息队列,应⽤程序空闲是,通过⼀个消息循环,搜索消息队列,不停的从消息队列抓取消息,并处理。
⼤致流程是:CwinThread->PumpMessage->CWnd->PreTranslateMessage->…………..->USER32内核->AfxWndProcBase->AfxWndProc->…….(继续处理)⽽⾮队列消息呢(即通过SendMessage⽅式发送的消息)?它是直接进⼊了USER32内核,然后处理的流程和队列消息⼀样了。
注意,不管是队列消息,还是⾮队列消息,都是从USER32内核开始,转到了AfxWndProcBase(有时候不经过这⾥),再到AfxWndProc,所以可以认为AfxWndProc是消息传递与处理的起点!出来后,不管是队列消息,还是⾮队列消息,应该由Windosw系统发往各个窗⼝的消息处理函数(这个处理函数是DefWindowProc,这是很直觉的想法,⽽且传统的SDK程序确实是这样的,但是MFC程序⽐传统的SDK多了document/view,如果如果某个消息是做⽂档处理,那么就让这个消息直接流到document中去不是更好吗?所以才有了MFC命令传递机制、MFC消息映射的出现),但是为什么都统⼀到了AfxWndProc这⾥呢?这⾥⽤到了钩⼦技术。
mfc函数
mfc函数详解MFC(Microsoft Foundation Classes)是Microsoft提供的一组用于开发Windows图形用户界面(GUI)应用程序的C++类库。
MFC包含了许多功能强大的类和函数,用于简化Windows 应用程序的开发。
下面是一些常用的MFC函数的简要说明:1. `CWinApp::InitInstance`:-该函数在应用程序启动时被调用,用于初始化应用程序的实例。
在这里,你可以创建主窗口、执行一些初始化操作等。
2. `CWinApp::Run`:- `Run` 函数负责启动消息循环,使应用程序进入主消息循环。
在消息循环中,应用程序等待并处理用户输入、系统消息等。
3. `CFrameWnd` 类的构造函数:- `CFrameWnd` 是MFC中用于创建主窗口的类。
通过构造函数,你可以设置主窗口的一些属性,如窗口标题、初始位置、大小等。
4. `CWnd::Create`:- `Create` 函数用于创建窗口。
你可以在这里指定窗口的类名、标题、风格等属性。
5. `CWnd::OnCreate`:-该函数在窗口被创建时被调用,你可以在这里进行一些初始化工作,如创建子窗口、初始化控件等。
6. `CWnd::OnPaint`:-当窗口需要重绘时,`OnPaint` 函数被调用。
你可以在这里进行绘图操作,使用GDI(图形设备接口)进行图形绘制。
7. `CWnd::OnCommand`:-处理窗口中的命令消息。
当用户执行一些操作(例如点击按钮)时,会触发命令消息,`OnCommand` 函数负责处理这些消息。
8. `CDialog` 类的消息映射:-在对话框应用程序中,你可以使用消息映射机制,将用户输入和系统消息与类的成员函数关联起来。
例如,通过`ON_BN_CLICKED`宏将按钮点击事件与特定的函数关联。
9. `CMenu` 类和菜单相关函数:- MFC提供了`CMenu` 类和一系列函数,用于创建和管理菜单。
详解DC、CDC、HDC、句柄、设备上下文
请问MFC中的DC、CDC、HDC、句柄、设备上下文究竟是什么意思?希望能解答详细一点点谢谢了楼主你没有了解MFC的运行机制就去看他写他所以你先要了解他的机制已经各个CPP .H都是什么下面我就给你说下在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API 你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库然后你来调用只不过这个类不是你写的MFC提供数百个类,最重要的、也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石。
1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库。
这些类封装WIN32应用程序编程接口,OLE(Object Link Embed 对象链接嵌入)特性,ODBC和DAO数据访问的功能。
2>继承特性:MFC抽象出了众多类的共同特性,并设计出一些基类作为实现其他类的基础,这些类中最重要的类是CObject类和CCmdTarget类,程序员可以从适当的MFC类中派生出自己的类,实现特定的功能达到编程的目的。
3>虚拟和消息映射:MFC是以C++为基础,当然支持虚函数,但作为一个编程框架必须要解决的是效率问题:如果MFC仅仅通过虚函数来支持动态约束必然会产生大量的虚函数表这样编程框架过于臃肿而且消耗更多的内存。
但是MFC 建立了消息映射机制这样降低了内存的使用却大大提高了效率消息映射是一个将消息和成员函数相互关联的表,当应用程序的框架窗口接收到一个消息时,MFC将搜索该窗口的消息映射,如果存在一个处理消息的处理程序,那么就调用该处理程序.它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V表),节省内存。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC中消息循环处理的几个函数之间的区别
Windows编程中一个比较原始的问题就是消息循环,现在很少有人关心这些了;
我个人对消息循环比较感兴趣,对底层的很多细节想深入了解!
以下说明几个消息循环中的常用函数进行对比
1 PostMessage 与SendMessage 函数对比
SendMessage把消息直接发送到窗口,并调用此窗口的相应消息处理函数,等消息处理函数结束后SendMessage才返回!SendMessage发送的消息不进入系统的消息队列;SendMessage函数有返回值PostMessage将消息发送到与创建窗口的线程相关联的消息队列后立即返回;PostMessage函数没有返回值;
2 GetMessage 与PeekMessage函数的对比
GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,UINT wRemoveMsg)根据参数可以看出以上2个函数的区别,参数wRemoveMsg的作用是指定消息获取的方式,如果设为
PM_NOREMOVE,那么消息将不会从消息队列中被移出,如果设为PM_REMOVE,那么消息将会从消息队列中被移出;
还有区别:
他们如果没有捕获到消息,程序的主线程会被操作系统挂起。
当操作系统再次回来照顾此线程时,发现消息队列中仍然没有消息可取,此时两个函数的行为就不同了:
GetMessage : 过门不入,操作系统再次挂起此线程,去照顾别的线程;
PeekMessage: 取回控制权,使程序执行一段时间,等待可能的消息进入消息队列并将其捕获;这时程序进入空闲时间阶段;。