ATL中的CWindowImpl模板类

感情迁移 提交于 2019-12-07 11:08:47

首先看一下这个模板类的声明

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类,给出了获取标题和创建窗口成员函数。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!