MFC的消息路由

windows中的消息虽然很多,但是种类并不繁杂,大体上有3种:窗口消息、命令消息和控件通知消息。

  窗口消息大概是系统中最为常见的消息,它是指由操作系统和控制其他窗口的窗口所使用的消息。例如CreateWindow、DestroyWindow和MoveWindow等都会激发窗口消息,还有我们在上面谈到的单击鼠标所产生的消息也是一种窗口消息。

  命令消息,这是一种特殊的窗口消息,他用来处理从一个窗口发送到另一个窗口的用户请求,例如按下一个按钮,他就会向主窗口发送一个命令消息。

  控件通知消息,是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows公共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本、操作控件的滚动条都会产生通知消息。 她类似于命令消息,当用户与控件窗口交互时,那么控件通知消息就会从控件窗口发送到它的主窗口。但是这种消息的存在并不是为了处理用户命令,而是为了让主窗口能够改变控件,例如加载、显示数据。例如按下一个按钮,他向父窗口发送的消息也可以看作是一个控件通知消息;单击鼠标所产生的消息可以由主窗口直接处理,然后交给控件窗口处理。

  其中窗口消息及控件通知消息主要由窗口类即直接或间接由CWND类派生类处理。相对窗口消息及控件通知消息而言,命令消息的处理对象范围就广得多,它不仅可以由窗口类处理,还可以由文档类,文档模板类及应用类所处理。

mfc的消息传递时从子类开始,如果子类没有,再寻找父类的消息处理函数

MFC程式实际运用中处理消息的顺序
1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWndobject,然后调用AfxCallWndProc
2.AfxCallWndProc() 该函数负责保存消息(保存的CONTENT 内容主要是消息标识符和消息函数)供程式实际运用以后实际运用,然后调用WindowProc()函数
3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数
4.OnWndMsg()        该函数的功能首先按字节对消息停止排序,对于WM_comMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应函数。任何被遗漏的消息将是唯一窗口消息。OnWndMsg()函数Search类的消息映像,以找到唯一能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到那样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数
5.OnCommand()       该函数查看这也许则唯一控件通知(lParam函数不为NULL,如果lParam函数为空的话,说明该消息否则控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他否则唯一控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数
6.OnCmdMsg()        根据接收消息的类,OnCmdMsg()函数将在唯一称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是唯一框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找唯一消息处理函数

MFC程式实际运用创建窗口的过程
1.PreCreateWindow()   该函数是唯一重载函数,在窗口被创建前,没去外国疑问在该重载函数中改变创建函数(没去外国疑问设置窗口风格等等)
2.PreSubclassWindow() 这也是唯一重载函数,允许首先子分类唯一窗口
3.OnMinMaxInfo()   该函数为消息响应函数,响应的是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消息,该函数被ShowWindow()函数调用
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消息,发送此消息以允许改变对话框中控件的字体

以上这一些的运行都是按给定的顺序运行!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Classes)是一组用于开发 Windows 应用程序的 C++ 类库。在 MFC 中,消息映射是一种机制,用于将 Windows 消息与相应的消息处理函数关联起来。 消息映射是通过在类的消息映射表中定义消息处理函数来实现的。消息映射表是一个由宏定义和消息映射项组成的静态数组。每个消息映射项指定了一个 Windows 消息的 ID 和相应的消息处理函数。 消息处理函数是类中的成员函数,用于处理特定的 Windows 消息。当一个窗口接收到一个消息时,MFC 会根据消息映射表中的定义找到对应的消息处理函数,并执行该函数来处理该消息。 下面是一个简单的示例,展示了如何使用消息映射和消息处理函数: ```cpp // 声明消息映射表 BEGIN_MESSAGE_MAP(CMyWnd, CWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() // 定义消息处理函数 void CMyWnd::OnPaint() { // 处理 WM_PAINT 消息 // ... } void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) { // 处理 WM_LBUTTONDOWN 消息 // ... } ``` 在上面的示例中,`CMyWnd` 是一个继承自 `CWnd` 的自定义窗口类。通过在消息映射表中使用 `ON_WM_PAINT` 宏和 `ON_WM_LBUTTONDOWN` 宏,将 `OnPaint` 函数和 `OnLButtonDown` 函数与 `WM_PAINT` 消息和 `WM_LBUTTONDOWN` 消息关联起来。 当窗口接收到相应的消息时,就会调用对应的消息处理函数进行处理。 需要注意的是,消息映射表中的消息处理函数必须是类的成员函数,并且符合特定的函数签名。 希望这个简单的解释能够帮助你理解 MFC 中的消息映射与消息处理机制。如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值