MFC学习笔记_01_消息处理
深入浅出MFC学习笔记
AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass *pNewClass) {
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass; CRuntimeClass::pFirstClass = pNewClass; }
在 MFC 中保存了一棵类的家族树,CObject 是根结点,其他的类都是他的后代(有几个特 殊的除外,如: CPoint 等)。由于类的家族树存放的是类的信息——不是对象的信息,因此 只需要保存一个就够了,所以 MFC 将这棵树保存为 static 类型。
MFC 类的家族树和数据结构中的树并不相同,普通的树通过跟结点就可以访问所有的结点 (包括叶子)。但在 MFC 中却不行——它只能逆向地从叶子结点向根结点方向访问(从父 结点访问不到子结点)。
size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum)); 想一想开发 bsearch 函数的人怎么会知道两个元素的是什么,怎么比较大小呢?因此就必须 留给用户要自己定义 cmp 函数了! 回调函数一般都有固定的格式(不知道是否会用变参数的情况),不然可能会发生错误。回
void main() {
A *pa = new B; pa->display(); }
执行的结果却打印是:class B
让人感觉不解的地方就是 pa 明明是类 A 的指针,却是执行了类 B 的函数(不可原谅)!!! 其实有这种感觉的人在不知不觉中就犯了一个形而上的错误:用 C 语言的函数行为来套用 display()的行为。在此我想提醒一点:把 C++当作一个新的语言,C 只是参考,不是金科玉 律,切记!!!
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高级编程学习笔记
No.3 /*SystemParametersInfo*/
//设置桌面壁纸
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,lpPath,0);
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);
(4)获取函数指针:PFUNC pFunc=(PFUNC)GetProcAddress(hdll,"函数名");
(5)调用函数后,释放DLL:FreeLibrary(hdll);
3.资源的导入使用(显式链接,以菜单导入为例)
(1)进行1中的步骤(1)(2);
(2)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll");
原型:
WINSHELLAPI HINSTANCE APIENTRY ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
2.文件删除:
BOOL DeleteFile(LPTSTR lpFileName);
3.文件复制:
BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists);其中参数bFailIfExists告诉系统当目标文件存在时如何操作,当bFailIfExists为true时,如果目标文件存在,则函数执行失败;当bFailIfExists为false时,如果目标文件存在,则覆盖目标文件。
mfc消息机制原理
MFC(Microsoft Foundation Classes)是一种用于开发Windows应用程序的C++类库,它建立在Win32 API之上,并提供了更高层次的抽象和封装。
在MFC中,消息机制是实现应用程序与用户交互和事件处理的基础。
MFC消息机制的原理如下:1.消息映射表:在MFC应用程序中,每个窗口类(如对话框类、视图类等)通常都有一个消息映射表(message map),用于将消息与相应的处理函数关联起来。
消息映射表是一个静态数据结构,通过DECLARE_MESSAGE_MAP宏进行声明,并在类的实现文件中使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏定义映射表的内容。
2.消息处理函数:每个消息映射表项将消息的ID(或者命令ID)与相应的消息处理函数绑定在一起。
消息处理函数是成员函数,由开发人员根据需要自行定义。
当相应的消息被触发时,系统会自动调用与该消息对应的处理函数。
3.消息循环:MFC应用程序在运行时通过消息循环(message loop)不断接收和分发消息。
消息循环负责从操作系统获取消息,并将消息派发给目标窗口的消息处理函数进行处理。
消息循环可以使用Run函数或AfxGetApp()->Run函数启动。
4.分发消息:当系统从消息队列中获取到一个消息后,会根据消息的目标窗口通过HWND来查找对应的CWnd对象,并调用该窗口的响应函数(如PreTranslateMessage、OnCmdMsg等)进行消息处理。
如果消息在目标窗口的消息映射表中找到了对应的处理函数,则将该消息转发给对应的处理函数进行处理。
5.消息处理:消息处理函数执行相应的逻辑,可以进行界面更新、控件操作、数据处理等操作。
处理函数的返回值通常是布尔型,表示是否终止消息的传递。
通过这种消息机制,MFC应用程序可以实现用户交互和事件处理的功能,使开发人员可以方便地处理窗口消息,响应用户操作,以及完成界面和数据之间的交互。
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消息结构和消息处理1.消息的结构为了从消息队列获取消息信息,需要使用MSG结构。
例如,::GetMessage函数(从消息队列得到消息并从队列中移走)和::PeekMessage函数(从消息队列得到消息但是可以不移走)都使用了该结构来保存获得的消息信息。
MSG结构的定义如下:typedef struct tagMSG { // msgHWND hwnd;UINT message;WPARAM wParam;LPARAM lParam;DWORD time;POINT pt;} MSG;该结构包括了六个成员,用来描述消息的有关属性:接收消息的窗口句柄、消息标识(ID)、第一个消息参数、第二个消息参数、消息产生的时间、消息产生时鼠标的位置。
2.应用程序通过窗口过程来处理消息每个“窗口类”都要登记一个如下形式的窗口过程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分支处理语句来识别和处理消息。
3.应用程序通过消息循环来获得对消息的的处理每个GDI应用程序在主窗口创建之后,都会进入消息循环,接受用户输入、解释和处理消息。
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 学习小笔记
7.VS 2005以后的自定义消息处理函数必须为LRESULT xxxx::UpdateMyCtrl(WPARAM hkey, LPARAM lkey)格式!
8.在界面中,坐标处理与数学相同,但是界面处理中Y轴向上为负数,向下为正!
9.ScreenToClient(crect),将控件的坐标转为基于父窗体坐标
23.写UI进程一搬用继承CWinThread和RUNTIME_CLASS(class name)创建线程即启动线程!
obk = mdc.SelectObject(&mbk); //选择绘制对象如钢笔的GDI。返回已替换的对象的指针
mdc.FillSolidRect(0,0,width,heigh,bkcolor); //用纯色填充矩形。
16.一个线程是否拥有消息队列要看它是否调用到了ui模块的功能
如果没有的话,就共用主线程消息队列
17 ::sendmessage vs sendmessage 第一个是系统的,第二个是封装在cwnd类中,第一个可以指定发送目标,第二个个人认为默认发送给自己.
18.CWebBrowser2 类,过
4. CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)xxx,LPVOID(yyy),0,&idtimer) //创建线程,已知XXX为线程函数名,YYY为参数
5.IsIconic() //判断窗口是否为最小化(图标)、
1.双重缓冲:
CDC mdc; //主要思路就是先创建一个虚拟dc和一张虚拟位图,用于将图像输出到虚拟设备上,
//内容在虚拟设备挥好后再输出到真实dc上显示出来,这样在要输出的时候才输出,提高了绘图效率
[工程科技]MFC的消息机制的实现原理和消息处理的过程
[工程科技]MFC的消息机制的实现原理和消息处理的过程下面几节将分析MFC的消息机制的实现原理和消息处理的过程。
为此,首先要分析ClassWizard实现消息映射的内幕,然后讨论MFC的窗口过程,分析MFC窗口过程是如何实现消息处理的。
1. 消息映射的定义和实现1. 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类派生。
在讨论了消息的分类之后,应该是讨论各类消息如何处理的时候了。
但是,要知道怎么处理消息,首先要知道如何映射消息。
1. MFC消息映射的实现方法MFC使用ClassWizard帮助实现消息映射,它在源码中添加一些消息映射的内容,并声明和实现消息处理函数。
现在来分析这些被添加的内容。
在类的定义(头文件)里,它增加了消息处理函数声明,并添加一行声明消息映射的宏DECLARE_MESSAGE_MAP。
常用MFC类和消息处理
常用MFC类MFC的类构成了一个完整的体系,该体系由一个被称为Cobject的类作为基类,其它类大部分由该类派生而来,如CWnd(窗口类)、Cdocument(文档类)、Cfile(文件类)等。
也有一部分类如字符串类,Cstring和时间类Ctime等则不从Cobject继承。
1. 窗口公共基类CWnd类CWnd对所有Windows窗口提供功能支持,它是所有窗口类的直接或间接父类。
一个CWnd对象和一个Windows窗口是有本质区别的,尽管它们有密切的联系。
CWnd对象是一个C++概念,即类的实例,而Windows窗口则是指向Windows内部数据结构的一个句柄,它的创建和显示要消耗系统资源。
一个CWnd对象通过其构造函数被创建,被析构函数销毁,而一个Windows窗口则通过CWnd的Create函数创建,被DestroyWindow函数销毁。
1) 窗口句柄(1) 窗口句柄的创建:当CWnd::Create被调用时,Windows窗口被创建,窗口句柄存放在CWnd的成员变量m_hWnd中。
(2) 程序中窗口句柄的取得:可以直接利用成员变量m_hWnd,但安全的方法是调用函数CWnd::Get(),它返回与窗口对象相关联的句柄,并且当窗口对象没有关联句柄时或当前CWnd指针为NULL时返回空指针。
(3) 窗口句柄的销毁:调用CWnd::DestroyWindow。
2) 窗口的大小和位置(1) IsIconic:窗口是否处在最小化状态。
(2) IsZoomed:判断窗口是否在最大化状态。
(3) MoveWindow:改变窗口的大小、位置和Z轴顺序。
Z轴顺序指本窗口和其他窗口的覆盖关系。
3) 窗口的状态(1) ShowWindow:显示或隐藏一个窗口,显示可以有多种方式:最大化、最小化、正常显示等。
(2) IsWindowEnabled:判断一个窗口是否可见。
(3) IsWindowEnabled:判断窗口的禁止/使能状态,禁止状态的窗口不能响应用户的键盘和鼠标的输入。
MFC 的消息处理
何谓消息、消息处理函数、消息映射?消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。
具体的某个操作是你的一系列代码。
称为消息处理函数。
在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。
一个switch case语句就可以搞定,消息循环直到遇到WM_QUIT消息才会结束,其余的消息均被拦截后调用相应的处理函数。
但在封装了API的MFC中,消息似乎变的有些复杂了,我们看不到熟悉的switch case语句了,取而代之的是一个叫消息映射的东西。
为什么MFC 要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单、工具条、控件这些都是子窗口,那我们需要写多少个switch case,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀。
因此MFC采用了一种新的机制。
利用一个数组,将窗口消息和相对应的消息处理函数进行映射,你可以理解成这是一个表。
这种机制就是消息映射。
这张表在窗口基类CWnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数。
这样做显然是高效的。
MFC提供的消息结构同时MFC定义了下面的两个主要结构:AFX_MSGMAP_ENTRYstruct AFX_MSGMAP_ENTRY{UINT nMessage; // Windows消息的ID号UINT nCode; // 控制消息的通知UINT nID; // Windows控制消息的IDUINT nLastID; //表示是一个指定范围的消息被映射的范围UINT nSig; //表示消息的动作标识AFX_PMSG pfn; // 指向消息处理函数的指针};AFX_MSGMAPstruct AFX_MSGMAP{#ifdef _AFXDLLconst AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();#elseconst AFX_MSGMAP* pBaseMap;#endifconst AFX_MSGMAP_ENTRY* lpEntries;};///AFX_MSGMAP可以得到基类的消息映射入口地址和得到本身的消息映射入口地址。
MFC学习笔记
//销毁窗口消息响应函数 void my_OnDestroy(HWND hwnd) {
PostQuitMessage(0); }
//左键按下消息响应函数 void my_LButtonDown(HWND hwnd) {
MessageBox(NULL,TEXT("鼠标左键按下"),TEXT("提示"),MB_OK); }
//样式(此处表示长或宽变化都
要重新绘制:redraw)
WndClass.lpfnWndProc = WndProc;
//过程函数名
WndClass.cbClsExtra = 0;
//窗口类相关额外参数
WndClass.cbWndExtra = 0;
//窗口实例相关的额外参数
WndClass.hInstance = hInst;
//消息循环 //这几行代码相当于汽车的发动机,让程序不断地运行 /*在程序的生存期中,Windows向他发送消息来报告用户或环境中其他部分所采取的动作,这些 消息放在一个队列中,用GetMessage可以取出消息*/ /* MSG {
HWND; 所属窗口句柄
UINT; 消息标识符 WPARAM; 消息附加信息 LPARAM; 同上 DWORD; 投递到消息队列时间 POINT; 鼠标当前位置 } */ while(GetMessage(&Msg,NULL,0,0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); }
}
m_strAddr = TEXT("");
UpdateData(FALSE);
}
index = m_ctrlAddr.GetCurSel();
MFC笔记
GetDlgItem:根据ID获取一个子窗口的对象地址(包含窗口句柄) GetDlgItemText和SetDlgItemText:根据ID获取或设置一个子窗口标题文字 GetDlgItemInt和SetDlgItemInt:根据ID获取或设置一个子窗口内显示的数字 GetDlgCtrlID和SetDlgCtrlID:根据窗口对象内的句柄获取或设置该窗口的ID GetParent和IsChild:这两个函数是等价的 GetWIndow: GetNextWIndow:
InitDialog函数用于初始化对话框中的子控件,可操作子窗口 Create函数主要用于 通用窗口的创建函数,如菜单、工具条等,窗口还未显示出来, 只有父窗口,子窗口还没创建 在非模式对话框中: 在使用EndDialog函数关闭时,只有隐藏没有真正关闭 使用DestroyWindow函数进行真正关闭
3—4讲,24分18秒
系统消息和非系统消息
• 系统消息编号:1—WM_USER-1 • 非系统消息:消息编号要大于1024,主要 用于传递数据
SendMessage函数和PostMessage函数的区别: 二者的功能: 能够向指定的窗口发送窗口消息,既可以是本进程内窗口 也可以是其它进程的 可以发送系统和非系统消息 SendMessage是阻塞型函数,用于调用指定窗口的内部程序,直到窗口 程序处理完毕后再返回 是非阻塞型函数,是将一个消息寄送到指定窗口内的消息 队列后立即返回
步骤如下: 1.定义自己的消息宏,如UM_ADD等,消息编号必须是大于 WM_USER,因为从1到WM_USER是系统消息; 2.自动添加消息处理函数 3.将“自定义的消息宏”和“消息处理函数”绑定,利用ON_ MESSAGE宏实现; 4.添加自己的代码,实现具体的功能
MFC学习笔记01消息处理
模态对话框和非模态对话框单线程,程序运行时,若运行了模态对话框,则线程会进入等待状态(运行模态对话框时会使线程进入一个while循环),直到模态对话框结束,在运行模态对话框期间,程序不能运行其他的对话框,运行非模态对话框时则可以。
单文档菜单消息的搜索流程是:视图类->文档类->文档模板类->框架窗口类->应用程序类。
如果找不到,则将相应的界面元素变灰。
1 消息的分类MFC 在Win32 的消息结构MSG 的基础上将消息分为三类:窗口消息、命令消息和控件消息。
消息的区别在于:消息类别标识和消息的附加参数不同。
消息映射:ON_COMMAND();(命令消息)ON_MESSAGE()(自定义消息);ON_WM_...(预定义消息);1.1 窗口消息1.1.1 基础知识相关操作:与窗口相关的操作,例如,创建窗口、绘制窗口、移动窗口、改变窗口尺寸、鼠标在窗口区域内的各种操作等。
凡是从基类CWnd派生的类都能够处理这类消息。
形式:WM_XXX,其中WM为窗口消息类型前缀,XXX表示具体的窗口消息种类。
1.1.2 窗口消息产生途径①窗口之间交互产生;②系统产生的窗口消息;③程序根据需要发送窗口消息。
1.2 命令消息1.2.1 基础知识相关操作:处理用户的某个请求或者执行用户的某个命令。
凡是从基类CCmdTarget 派生的类都能够处理这类消息。
形式:WM_COMMAND主要字段:message(消息类别)WM_COMMANDwParam(附加参数)低16位为命令ID、高16位为0。
lParam(附加参数)0L由于wParam 的高、低16位表示不同的含义,需要分解。
wParam来判断命令消息,也需要组装一个wParam用于生成命令消息。
系统提供的宏可以帮助完成这些工作。
1.2.2 参数分解HIGHWORD(wParam);获取高16位,为0表示M_COMMAND类别的消息为命令消息。
LOWWORD(wParam);获取低16位,为命令的资源ID。
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中常用的消息处理方法
一、自定义消息假如想在CMyMessageDlg类中添加自定义消息:1、在头文件"MyMessageDlg.h"中添加自定义消息的宏声明:#define WM_USER_MYMESSAGE WM_USER + 1002、在头文件"MyMessageDlg.h"中添加消息映射函数的声明:afx_msg void OnMyMessageProc(WPARAM wParam, LPARAM lParam);3、在文件"MyMessageDlg.cpp"中添加处理自定义消息的宏:ON_MESSAGE(WM_USER_MYMESSAGE, OnMyMessageProc)4、在文件"MyMessageDlg.cpp"中添加自定义消息函数的实现部分:void CMyMessageDlg::OnMyMessageProc(WPARAM wParam, LPARAM lParam){// ……}5、触发自定义消息的方法:void CMyMessageDlg::OnOK(){// 调用自定义消息SendMessage(WM_USER_MYMESSAGE, (WPARAM)0, (LPARAM)0);}二、消息拦截假如想拦截自定义消息“WM_USER_MYMESSAGE”和系统消息“WM_SIZE”:#define WM_USERMESSAGE_NULL WM_USER+32 // 自定义消息重载WindowProc函数,在函数中实现消息的拦截LRESULT CMyMessageDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){// TODO: Add your specialized code here and/or call the base classswitch (message){case WM_USERMESSAGE:AfxMessageBox("自定义消息拦截");// 如果在这里把消息销毁掉,不让其正确转发,则对应的消息处理函数就不会被调用了。
MFC编程基础教程
MFC编程基础教程
MFC(Microsoft Foundation Class)是一套用于Windows平台下GUI应用程序开发的C++类库。
它是微软公司为了简化Windows应用程序开发而开发的,提供了许多可以直接调用的类和函数,可以方便地进行窗口管理、控件操作、消息处理等操作。
首先,窗口的创建是MFC编程的基础。
在MFC中,窗口的创建是通过派生CWnd类来实现的。
通过调用CWnd类的Create函数,可以创建一个窗口,并指定窗口的样式、位置、大小等信息。
另外,MFC还提供了一个CFrameWnd类,用于创建带有菜单和工具栏的主窗口。
消息处理是MFC编程中的关键环节。
在MFC中,每个窗口都有一个消息映射表,用于将Windows消息与相应的处理函数关联起来。
当窗口接收到消息时,MFC会自动调用相应的处理函数进行消息处理。
通过消息映射表,可以处理按钮点击、窗口关闭等各种消息。
菜单在MFC中也是常用的界面元素之一、菜单可以包含各种功能选项和子菜单。
MFC提供了一个CMenu类,用于创建和操作菜单。
通过CMenu 类的成员函数,可以实现菜单的创建、添加、删除和响应菜单项的点击等操作。
除了上述内容,MFC还包括了其他一些重要的特性,例如文件操作、多文档界面、打印和打印预览等。
这些特性使得MFC成为一个功能强大且灵活易用的开发框架。
综上所述,MFC编程基础教程主要包括窗口创建、控件操作、消息处理、对话框和菜单等内容。
通过学习这些基础知识,可以帮助初学者快速上手MFC编程,实现各种Windows平台下的GUI应用程序开发。
MFC中CWnd类及其派生类对话框、消息处理、窗口操作
MFC中CWnd类及其派生类对话框、消息处理、窗口操作CWnd类我们在屏幕上看到的所有对象都和窗口有关,它们或者派生于CWnd,属继承关系,如对话框、工具栏、状态栏、子控件;或者被CWnd合成,属服务员与服务对象关系,如图标、菜单、显示设备。
CWnd类封装的窗口操作主要包含窗口的创建和销毁、操作窗口风格、操作窗口状态、窗口子类化、获取指定窗口等。
当然,CWnd还实现了其他功能:1、绘制窗口GetDC()//取得客户区显示设备上下文GetWindowsDC()//取得整个窗口的显示设备上下文ReleaseDC()BeginPaint()EndPaint()PrintClient()RedrawWindow()//重绘客户区的某区域2、操作窗口子控件GetDlgItem():取得(临时的)控件对象指针SetDlgItemText()和GetDlgItemText():设置、取得控件标题SubclassDlgItem():将控件句柄与相应类相关联DlgDirList()和DlgDirListComboBox():以文件列表或目录列表填充(组合框)列表框CheckDlgButton()和CheckRadioButton():设置复选框(单选按钮)状态。
GetNextDlgTabItem():取得下一个WS_TABSTOP风格控件3、窗口定时器SetTimer():设置定时器KillTimer():销毁定时器4、窗口消息的相关函数GetCurrentMessage():取得当前被处理的消息PreTranslateMessage():可重载的虚函数。
被UI线程的消息循环调用,可以过滤窗口收到的消息,过滤出的消息得以分发SendMessage():向本窗口发送消息。
不通过消息循环,直接调用窗口函数处理消息。
窗口函数执行完毕,该函数才返回PostMessage():向本窗口寄送消息。
将消息放入消息队列,立即返回。
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的消息处理模式一消息与输入焦点Windows编程与其它类型编程的最大不同之处在于使用消息机制,所有的Windows 应用程序都是消息驱动的,消息机制是Windows应用程序的核心。
在Windows中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么。
在Windows中,所有的消息都有一个特定的名字,实质上是用不同的整数来标记。
Windows系统预定义了许多消息,每个消息都拥有一个宏定义,即用形象的字符串来标识消息,一系列#define 语句将消息与特定数值联系起来,可以在头文件WinUser.h中找到这些宏定义,例如#define WM_PAINT 120可以在程序中通过消息名“WM_PAINT”来访问它。
其他消息如:#define WM_MOUSEMOVE 0x0200#define WM_LBUTTONDOWN 0x0201#define WM_LBUTTONUP 0x0202#define WM_LBUTTONDBLCLK 0x0203#define WM_RBUTTONDOWN 0x0204#define WM_RBUTTONUP 0x0205#define WM_RBUTTONDBLCLK 0x0206#define WM_MBUTTONDOWN 0x0207#define WM_MBUTTONUP 0x0208#define WM_MBUTTONDBLCLK 0x0209消息是由消息的名称(UINT)和两个参数(WPARAM, LPARAM)组成。
消息的参数中包含有重要的信息。
例如对鼠标消息而言,LPARAM中一般包含鼠标的位置信息,而WPARAM参数中包含了发生该消息时,SHIFT、CTRL等键的状态信息,对于不同的消息类型来说,两个参数也都相应地具有明确意义。
Windows是一个以消息为导向的系统,应用程序只能被动地等待消息的发生,每当键盘上有个键被按下,系统就会发出一个按键消息给窗口,告诉它某个键被按下去了,只要鼠标移动一下,系统也会发出相应的消息,并把鼠标的坐标信息传给窗口。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模态对话框和非模态对话框单线程,程序运行时,若运行了模态对话框,则线程会进入等待状态(运行模态对话框时会使线程进入一个while循环),直到模态对话框结束,在运行模态对话框期间,程序不能运行其他的对话框,运行非模态对话框时则可以。
单文档菜单消息的搜索流程是:视图类->文档类->文档模板类->框架窗口类->应用程序类。
如果找不到,则将相应的界面元素变灰。
1 消息的分类MFC 在Win32 的消息结构MSG 的基础上将消息分为三类:窗口消息、命令消息和控件消息。
消息的区别在于:消息类别标识和消息的附加参数不同。
消息映射:ON_COMMAND();(命令消息)ON_MESSAGE()(自定义消息);ON_WM_...(预定义消息);1.1 窗口消息1.1.1 基础知识相关操作:与窗口相关的操作,例如,创建窗口、绘制窗口、移动窗口、改变窗口尺寸、鼠标在窗口区域内的各种操作等。
凡是从基类CWnd派生的类都能够处理这类消息。
形式:WM_XXX,其中WM为窗口消息类型前缀,XXX表示具体的窗口消息种类。
1.1.2 窗口消息产生途径①窗口之间交互产生;②系统产生的窗口消息;③程序根据需要发送窗口消息。
1.2 命令消息1.2.1 基础知识相关操作:处理用户的某个请求或者执行用户的某个命令。
凡是从基类CCmdTarget 派生的类都能够处理这类消息。
形式:WM_COMMAND主要字段:message(消息类别)WM_COMMANDwParam(附加参数)低16位为命令ID、高16位为0。
lParam(附加参数)0L由于wParam 的高、低16位表示不同的含义,需要分解。
wParam来判断命令消息,也需要组装一个wParam用于生成命令消息。
系统提供的宏可以帮助完成这些工作。
1.2.2 参数分解HIGHWORD(wParam);获取高16位,为0表示M_COMMAND类别的消息为命令消息。
LOWWORD(wParam);获取低16位,为命令的资源ID。
例如:菜单命令消息中:菜单项的资源ID;工具栏按钮消息中:工具栏按钮对应的资源ID;加速键消息中:加速键对应的资源ID。
1.2.3 参数组合使用宏MAKEWPARAM,例如:生成一条打开文件的命令消息,打开文件的菜单项的资源ID为ID_FILE_OPEN,消息命令为:(WM_COMMAND, MAKEWPARAM(ID_FILE_OPEN, 0), 0L)1.2.4 命令消息产生途径①选择菜单项;②单击工具栏按钮;③按加速键;④程序根据需要发送的命令消息。
1.3 控件消息1.3.1 相关操作此类消息与控件窗口中的某个事件相关,例如:文本框控件窗口内的内容发生改变、列表框控件中某个选项被选择、按钮控件被单击、滑杆条的游标被移动等,都会发出相应的控件事件消息。
1.3.2 形式由于控件是近年来软件开发中最为活跃的,控件的种类不断增加,随之控件消息的类别也迅速增加,原来的控件消息格式越来越不能满足控件消息的描述,因此,必须寻求新的控件消息描述方法。
由于历史的原因,控件消息的新旧描述形式必须并存才能兼容所有的控件消息。
1.3.3 控件消息产生途径①由控件的各类事件发出;②程序根据需要模拟控件事件发送通知消息。
2 自定义消息2.1 自定义消息的步骤①添加自定义消息,例如:#define WM_MESSAGENAME (WM_USER+100)(Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息)②在.H头文件中,添加消息响应函数,该函数有规定的格式:LONG Function_Name(WPARAM w, LPARAM l);对于添加的自定义消息WM_MESSAGENAME的函数处理形式如下:LONG OnMessageName(WPARAM w, LPARAM l);③添加消息响应宏在响应该消息的类的消息响应块中,加入以下语句。
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)④在.cpp源文件中,添加消息响应函数体。
其代码如下:LONG CMyClass::OnMessageName(WPARA w,LPARAM l){}(类向导ClassWizard不允许增加用户自定义消息,所以开发人员必须手工添加。
添加后,类向导ClassWizard就可以像处理其他消息一样处理自定义消息了。
) 如果用户需要整个系统唯一的消息,则可以调用SDK函数RegisterWindowMessage()并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。
⑤给窗口发送消息SendMessage(WM_MESSAGENAME,0L,0L);2.2 SendMessage和PostMessageSendMessage传递消息后,需要等到消息被处理完成才能返回。
SendMessage方法:首先,应获取接收消息的CWnd类对象的指针;然后,调用CWnd的成员函数SendMessage( )。
LRESULT Res=pWnd->SendMessage(UINT Msg,WPARAM wParam, LPARAM lParam);pWnd指针指向目标CWnd类对象。
变量Msg是消息,wParam和lParam变量包含消息的参数,如鼠标单击哪里或选择了什么菜单项。
目标窗口返回的消息结果放在变量Res中。
发送消息到一个没有CWnd类对象的窗口,可以用下列目标窗口的句柄直接调用Windows API:LRESULT Res=::SendMessage(HWND hWnd , UINT Msg , WPARAM wParam , LPARAM lParam);这里的hWnd是目标窗口的句柄。
PostMessage传递消息后直接返回,不需要等待消息被处理。
用MFC寄送一个消息与发送一个消息几乎相同,但寄送时用PostMessage( ),而不是用SendMessage( );返回值Res也不一样,Res不是一个由目标窗口返回的值,而是一个布尔值,用来表示消息是否成功地放到消息队列中。
2.3 Windows消息值的范围#define WM_USER 0x0400消息值范围意义0x0000-0x03FF Windows消息0x0400-0x7FFF 用户自定义的消息0x8000-0xBFFF Windows保留值0xC000-0xFFFF 供应用使用的字符串消息3 定时器消息定时器消息属于系统预定义消息,可以通过ClassWizard添加定时器消息(WM_TIMER)响应函数。
对定时器进行初始化SetTimer(),使定时器失效KillTimer()。
4 消息传递方式4.1 同步方式同步方式(发送):发送一个消息时,直接调用窗口的窗口过程。
通信是即时的,直到窗口进程为调用函数返回一个结果后,应用程序才能继续。
SendMessage采用同步方式发送消息。
SendMessage返回被处理的消息的结果值。
4.2 异步方式异步方式(寄送):寄送一个消息时,只是把消息发送到拥有那个窗口的应用程序消息队列中。
一有空闲,应用程序就搜索消息队列,并在消息队列中处理消息,即从队列中删除它们,并将它们发送到即定窗口。
通信将可能延迟,直到目标应用程序获得处理消息的时间。
调用函数发送消息后马上返回,但结果只是表示消息寄送成功与否,而不是被调用窗口过程的结果。
PostMessage采用异步方式发送消息。
PostMessage返回一个布尔值,指明消息是否被成功地放入到消息队列中。
5 MFC消息映射所谓消息映射,简单地讲,就是让程序员指定要某个MFC类(有消息处理能力的类)处理某个消息。
MFC提供了工具ClassWizard来帮助实现消息映射,在处理消息的类中添加一些有关消息映射的内容和处理消息的成员函数,程序员将完成消息处理函数,实现所希望的消息处理能力。
消息映射就是用一个数据结构把“消息”与“响应消息函数名”串联起来。
5.1 消息映射方法MFC内部通过一系列非常复杂的宏处理消息映射,但定义和使用消息映射表却相对简单,可通过三个步骤完成:①在头文件的类声明中添加DECLARE_MESSAGE_MAP宏,声明消息映射,并声明消息处理函数的原型;②在类的定义文件(.cpp)定义消息映射表,方法是在文件的开始处添加BEIGN_MESSAGE_MAP和END_MESSAGE_MAP 这一对宏,在它们之间放置消息映射宏,定义并初始化消息映射表,将消息与处理消息的函数之间建立联系;③在类的定义文件(.cpp)中添加消息处理函数。
5.2 消息宏的分类5.2.1 对窗口消息的响应消息宏ON_WM_xxx定义对标准Windows消息WM_xxx的响应,所有派生自CWnd的类均可响应这类消息,系统默认的响应函数为OnXxx,对应关系见下表:宏名消息默认处理函数ON_WM_CHAR WM_CHAR OnCharON_WM_CREATE WM_CREATE OnCreateON_WM_LBUTTONUP WM_LBUTTONUP OnLButtonUp①键盘消息WM_CHAR: 该消息的处理函数是OnChar()WM_KEYDOWN: 用户按下一个非系统键WM_KEYUP: 在非系统键被释放时产生②鼠标消息WM_MOUSEMOVE,用户将鼠标移进窗口或在窗口中移动WM_LBUTTONDOWN,用户按下左键WM_LBUTTONUP,用户释放左键WM_LBUTTONDBCLICK,用户双击左键WM_RBUTTONDOWN,用户按下右键WM_RBUTTONUP,用户释放右键WM_RBUTTONDBCLICK,用户双击右键③窗口消息WM_CREATE,窗口被创建WM_DESTROY,窗口被销毁WM_CLOSE,窗口被关闭WM_MOVE,窗口发生移动WM_SIZE,窗口发生改变WM_PAINT,窗口发生重绘④焦点消息WM_SETFOCUS,窗口得到焦点WM_KILLFOCUS,窗口失去焦点⑤定时器消息WM_TIMER,响应定时器的定时事件。
5.2.2 对命令消息的响应ON_COMMAND宏定义对命令消息的响应,格式为ON_COMMAND(<命令ID>,<响应函数>),举例如下:ON_COMMAND(ID_APP_ABOUT,OnAbout)//表示ID_APP_ABOUT消息由OnAbout()响应//以下类似ON_COMMAND(ID_FILE_NEW,OnFileNew)所有由用户定义的命令消息也由ON_COMMAND定义消息映射关系。
5.2.3 对控件消息的响应控件消息由按钮(BN_)、编辑框(EN_)、组合框(CBN_)、列表框(LBN_)等产生,在消息名前加上ON_即构成宏名,举例如下:ON_BN_CLICKED(<按钮ID>,<响应函数>)ON_CBN_DBCLK(<组合框ID>,<响应函数>)ON_EN_SETFOCUS(<组合框ID>,<响应函数>)ON_LBN_DBCLK(<列表框ID>,<响应函数>)分别表示选择各个控件后,产生的消息由其后面定义的函数进行处理。