ATL和MFC的C++类和HWND的映射机制
来源:互联网 发布:淘宝助理4.6版下载 编辑:程序博客网 时间:2024/04/27 06:32
最近看深入解析ATL这本书的时候看到ATL中的窗口类实现的时候,很是惊异于ATL的Thunk的运用技术,,ATL运用Thunk技术把C++的成员函数置换成Windows窗口的消息处理函数。那么更古老的MFC框架又是怎么实现CWnd类到HWND窗口类之间的映射的呢? 下面的文章将ATL和MFC的窗口封装机制做个对比.
如果让我完成C++类到HWND窗口的映射,我会写如下的代码
BOOL CMyWnd::Create(...)
{
...
HWND hWnd = ::CreateWindowEx(...);
this->m_hWnd = hWnd;
//置换hWnd窗口过程
...
}
我相信很多程序员都会像这样封装的,但是这样有一个很大的问题,API函数CreateWindowEx在创建返回之前,Windows已经发送了一些消息给创建好的窗口,其中包括很重要的WM_CREATE消息,而将C++的成员函数置换hWnd的窗口例程是在CreateWindowEx返回之后,因此C++的成员函数就没办法处理WM_CREATE消息,这可就不行了。看看MFC和ATL是怎么完成的。
1. MFC的实现过程:
MFC的CWnd封装了Windows窗口,其创建函数为CreateEx成员函数,CreateEx函数在调用CreateWindowEx方法之前首先通过AfxHookWindowCreate函数建立一个CBT钩子,该钩子的作用在于钩取创建窗口的事件.赶在创建窗口完成之前建立HWND到CWnd的全局映射,之后置换窗口处理函数为AfxWndProc标准函数,这样做的目的在于CreateEx函数内部调用CreateWindowEx API创建HWND, CreateWindowEx函数返回之后调用AfxUnhookWindowCreate卸载CBT钩子。
AfxWndProc函数过程:
从全局映射中取出与句柄HWND相对应的CWnd对象,找到后调用CWnd:: WindowProc的成员函数,剩下的调用就在于CWnd中消息和消息处理函数的映射表了.
2.ATL的实现过程:
ATL中的宏DECLARE_WND_CLASS为CWindowImpl类提供Windows窗口的注册信息,其定义如下:
#define DECLARE_WND_CLASS(WndClassName) "
static ATL::CWndClassInfo& GetWndClassInfo() "
{ "
static ATL::CWndClassInfo wc = "
{ "
{ sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, StartWindowProc, "
0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, "
NULL, NULL, IDC_ARROW, TRUE, 0, _T("") "
}; "
return wc; "
}
通过宏代码可以看出,其提供给注册的窗口例程为StartWindowProc函数, StartWindowProc函数代码如下:
- ATL和MFC的C++类和HWND的映射机制
- ATL和MFC的C++类和HWND的映射机制
- afxMapHWND(保存CWnd类和HWND之间的映射)
- Lesson4 MFC消息映射机制和CDC类的使用
- Lesson4 MFC消息映射机制和CDC类的使用
- MFC的CWnd和HWND之间互相转换方法
- MFC的CWnd和HWND之间互相转换方法
- MFC的CWnd和HWND之间互相转换方法
- MFC的CWnd和HWND之间互相转换方法 .
- MFC的CWnd和HWND之间互相转换方法
- MFC的CWnd和HWND之间互相转换方法
- VC++、MFC、COM和ATL的区别
- VC++、MFC、COM和ATL的区别
- MFC、COM和ATL的区别
- VC++、MFC、COM和ATL的区别
- VC++、MFC、COM和ATL的区别
- MFC消息映射机制和绘图DC的获取
- MFC程序的运行过程和消息映射机制
- NET中最常有集合与泛型集合
- 用户称Twitter广告尚处磨合期但大有潜力
- 我的第一篇博客
- 使用curses管理基于文本的屏幕
- Steve Jobs 配音,苹果 1997 年的「那些疯子」广告
- ATL和MFC的C++类和HWND的映射机制
- seq_file接口
- 在VMware下运行Fedora Linux以root身份登入时显示鉴定故障
- 搭建软件框架
- 乔布斯不为外界所知贡献:打造更环保的苹果
- 乔布斯的5个难解之谜
- 有关乔布斯健康问题关键时间和事件
- 7、XML数据类型的高级应用
- Runnable Thread 线程的实现