首先看一下这个模板类的声明
template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits> class CWindowImpl;
从声明中可以看出,有两个默认参数。
TBase是默认的窗口基类,这个CWindow简单封装了HWND,并且封装了几乎所有的Use32 APIs中以HWND为第一个参数的接口。CWindow提供一个共有的成员m_hWnd,可以直接处理HWND,也提供了一个operator HWND(),可以直接是CWindow作为需要HWND对象的函数参数。CWindow不同于MFC中的 CWnd。CWindow易于创建的,它不提供像MFC中的HWND到CWnd的对象关系。当CWindow对象超出作用域时,它被销毁,但是它关联的实际窗口不会被销毁。因此不需要detach你创建的临时的CWindow对象。
TWinTraits 是默认的窗口特征。
接下来,看一下它的定义的代码:
template <class T, class TBase /* = CWindow */, class TWinTraits /* = CControlWinTraits */>
class ATL_NO_VTABLE CWindowImpl :
public CWindowImplBaseT< TBase, TWinTraits >
在这里又继承了CWindowImplBaseT模板类。它的定义如下:
template <class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CWindowImplBaseT :
public CWindowImplRoot< TBase >
可以看出,最终继承了CWindowImplRoot模板类,它的定义如下:
template <class TBase /* = CWindow */>
class ATL_NO_VTABLE CWindowImplRoot :
public TBase,
public CMessageMap
这个CWindowImplRoot类继承了一个TBase和CMessageMap。TBase默认就是CWindow类。当然,这个TBase基类也可以使用自己封装的,但一般情况下使用CWindow就可以了。另外一个CMessageMap类,声明如下:
class ATL_NO_VTABLE CMessageMap
{
public:
virtual BOOL ProcessWindowMessage(
_In_ HWND hWnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam,
_Inout_ LRESULT& lResult,
_In_ DWORD dwMsgMapID) = 0;
};
这是一个抽象基类,作用仅仅是提供了一个处理消息映射的接口。所有继承CMessageMap的类必须实现这个接口。在这个抽象基类中,另外一个需要注意的成员函数如下
void SetMsgHandled(_In_ BOOL bHandled)
{
_ATL_MSG* pMsg = (_ATL_MSG*)GetCurrentMessage(); // override const
ATLASSUME(pMsg != NULL);
ATLASSERT(pMsg->cbSize >= sizeof(_ATL_MSG));
pMsg->bHandled = bHandled;
}
在这里有一个_ATL_MSG是对继承MSG,并对MSG简单做了包装。这个函数的作用就是设置消息是否被处理过了。如果设置为TURE,就不再向下传递,如果设置为FALSE,就继续向下传递。
到此,CWindowImplRoot模板类算是说完了。再向上看一下CWindowImplBaseT模板类。在这个类中,提供了获取窗口风格、获取窗口过程函数、子类化、创建和销毁窗口等相关成员函数。
最后,再来说说CWindowImpl模板类。它提供了获取标题和创建窗口两个成员函数。它的创建窗口函数,是调用了CWindowImplBaseT中提供的静态成员Create函数。
总结一下:
1.CWindowImplRoot类,继承了CWindow和CMessageMap。
2.CWindowImplBaseT类,继承CWindowImplRoot类,这里面又提供了窗口过程相关的函数、创建和销毁窗口的函数等等。
3.CWindowImpl类,继承了CWindowImplBaseT类,给出了获取标题和创建窗口成员函数。
来源:CSDN
作者:路遇天使
链接:https://blog.csdn.net/declarefly/article/details/53668346