MFC消息处理(一)
来源:互联网 发布:qq三国卡79js最高配置 编辑:程序博客网 时间:2024/05/20 05:06
1、MFC窗口如何与AfxWndProc建立联系。
当一个新的CWnd派生类创建时,在调用CWnd::CreateEx()过程中,MFC都会安装AfxCbtFilterHook()。这个Hook将拦截HCBT_CREATEWND,将窗体的消息处理函数设置为AfxWndProc()。
_AfxCbtFilterHook通过SetWindowLongPtr函数将窗口的处理函数替换成AfxWndProc(),同时,在CWnd::m_pfnSuper中保存原来的窗口消息处理函数指针。
微软不将AfxWndProc()做为注册窗口过程的原因是DefWindowPorc()可以支持3D控件。这些控件都在微软的CTL3D.dll中。如果系统具有CTL3D功能已经是一种迫切需要,那么应用程序就要覆盖CTL3D的功能(在处理WM_CTLCOLOR消息方面)。为了确保这一点,MFC必须按照以下顺序调用:AfxWndProc()、CTL3D的WndProc()和最后的DefWindowProc()。可见为了确保这一点,微软不得不允许CTL3D在AfxWndProc()之前分类,这就意味着延迟AfxWndProc()的引入。
2、处理消息
MFC用两种方式表示窗口:(1)用统一的系统定义的窗口句柄;(2)用表示窗口的C++类。窗口句柄由CWnd和CWnd的派生类包装。因为窗口句柄是CWnd的成员变量。
MFC用CMapPtrToPtr对象将窗口句柄映射成CWnd对象。MFC在窗口存在期间维护这个链接。如果使用CWnd创建一个窗口,窗口句柄就会和CWnd对象关联在一起,也就是说二者通过句柄映射表关联在一起,MFC这样做就使得框架可以使用C++对象,而不是窗口句柄。
AfxWndProc()处理一个特定消息:WM_QUERYAFXWNDPROC,如果消息是WM_QUERYAFXWNDPROC,AfxWndProc()就返回1。应用程序可以通过发送WM_QUERYAFXWNDPROC消息来查询该窗口是否是使用MFC消息映射系统的MFC窗口。
OnWndMsg函数很大,它首先过滤出WM_COMMAND、WM_NOTIFY、WM_ACTIVE和WM_SETCURSOR。对于这几个消息,框架有自己的处理方法。如果不是这几个,OnWndMsg会在消息映射表中查找消息。MFC维护着一个消息映射表入口缓存,可以通过散列值访问它。
- MFC消息处理(一)
- 090926(星期六):MFC消息处理机制
- MFC 的消息处理
- MFC消息处理【基本理论】
- MFC中的消息处理
- mfc 消息映射 处理
- MFC消息处理
- MFC消息处理顺序
- mfc消息处理顺序
- MFC 消息处理顺序
- mfc消息处理机制
- MFC消息处理笔记
- MFC消息处理
- MFC 消息处理总结
- MFC消息处理函数
- MFC消息处理函数
- [MFC]鼠标消息处理
- MFC消息处理流程
- 【每天读一点英文】gnuhpc注释版:Change Makes Life Beautiful
- TestSuite的使用
- UML网址参考
- zoj 2433 Highways
- Oracle Linux 6 DVDs Now Available
- MFC消息处理(一)
- [转]android 源码目录分析
- [转]android 源码目录分析
- [转]android 源码目录分析
- 设计模式之Factory
- 【转】Windows下基于ADS+J-Link 的ARM开发环境搭建
- C# FileSystemWatcher 组件应用
- NS2安装相关软件下载
- 在容器中使用增强的for循环,简洁大气,结构清晰