ATL 窗口类源代码学习笔记
本文是自己学习源代码的总结,在写作过程和察看代码寻找资料的时候,找到了些文章。
可参考:
WTL流程分析-初稿
ATL中的Thunk机制学习
1,CWindow
ATL有一个专门为窗口设计的基础类,可以做全部的窗口操作,这就是CWindow。它实际上就是对HWND操作的一个包装类,对几乎所有以HWND句柄为第一个参数的窗口API的进行了封装,例如:SetWindowText() 和 DestroyWindow()。CWindow类有一个公有成员m_hWnd,使你可以直接对窗口的句柄操作,CWindow还有一个操作符HWND,可以将CWindow对象传递给以HWND为参数的函数。
CWindow是一个普通的C++类。创建一个CWindow对象占用很少的资源,因为只有一个数据成员。
2,CWindowImpl继承树
在ATL类中对窗口过程的实现是CWindowImpl。CWindowImpl 含有所有窗口实现代码,例如:窗口类的注册,窗口的子类化,消息映射以及基本的WindowProc()函数。
我们先追根溯源,看看其继承过程:
一般来说,我们需要定义一个自己的窗口,首先就从CWindowImpl继承而来。
class CMyWnd : public CWindowImpl
template
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT< TBase, TWinTraits >;
template
class ATL_NO_VTABLE CWindowImplBaseT : public CWindowImplRoot< TBase >;
template
class ATL_NO_VTABLE CWindowImplRoot : public TBase, public CMessageMap;
class ATL_NO_VTABLE CMessageMap
{
public:
virtual BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
LRESULT& lResult, DWORD dwMsgMapID) = 0;
};
2.1,CMessageMap
该类是一个纯虚类,主要目的是提供对windows消息的处理接口。凡是继承自该类的子类,均有处理windows消息的函数了。
2.2,CWindowImplRoot
template
class ATL_NO_VTABLE CWindowImplRoot : public TBase, public CMessageMap;
首先看看TBase,这家伙是什么呢?就是我们在定义自己的窗口类的时候,传入的CWindow
class CMyWnd : public CWindowImpl
TBase说明了我们自己定义的窗口类的祖先类是什么了。所以我们是不是可以从CWindow继承一个类来,然后将此子类作为类型参数传过去呢?完全可以。有了这个TBase,我们在写程序的时候,可以由自己控制从什么基类继承。
CWindowImplRoot定义了这几个成员,都是公有的。
CWndProcThunk m_thunk;
const _ATL_MSG* m_pCurrentMsg;
DWORD m_dwState;
它的几个成员函数主要是针对m_pCurrentMsg处理的。如:
// Current message
const _ATL_MSG* GetCurrentMessage() const
// "handled" management for cracked handlers
BOOL IsMsgHandled() const
void SetMsgHandled(BOOL bHandled)
还有就是对消息的推进和反射的支持方面。
// Message forwarding and reflection support
LRESULT ForwardNotifications(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT ReflectNotifications(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
static BOOL DefaultReflectionHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult);
似乎对 m_dwState,m_thunk没有做什么处理。
关于CWndProcThunk,需要看:
ATL中的Thunk机制学习,
http://dev.csdn.net/develop/article/20/20532.shtm
2.3,CWindowImplBaseT
template
class ATL_NO_VTABLE CWindowImplBaseT : public CWindowImplRoot< TBase >;
看看CControlWinTraits这玩意。
/////////////////////////////////////////////////////////////////////////////
// CWinTraits - Defines various default values for a window
template
class CWinTraits
{
public:
static DWORD GetWndStyle(DWORD dwStyle)






