分析CTabView的原因,是我想改进现有的 CTabViewImpl, 最终目标是建立一套界面类似VS2010的控件集合。我已经做了一些工作,改进了菜单部分,对于分割窗口也进行了改写,剩下部分就是这个 CTabView了。我已经大致看了下整个 CTabViewImpl的代码,显然这个地方的改动的部分会比较多。现在我们就带着这个目的来分析目标源码。
template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
class ATL_NO_VTABLE CTabViewImpl : public ATL::CWindowImpl<T, TBase, TWinTraits>
{
public:
DECLARE_WND_CLASS_EX(NULL, 0, COLOR_APPWORKSPACE)
这个分类的关键成员是: ATL::CContainedWindowT<CTabCtrl> m_tab;
继续向下解释之前,要先弄清楚这个 ATL::CContainedWindowT容器类的作用。CContainedWindowT 是一个模板类,它起到对基类行为进行扩充的目的。
CContainedWindowT<CEdit>, CContainedWindowT<CTabCtrl>, 在主窗口里面这样实现的成员,它的消息会给映射到主窗口类的一个分段。我们看看 CTabViewImpl 的构造函数和消息映射。
CTabViewImpl() :
m_nActivePage(-1),
m_cyTabHeight(0),
m_tab(this, 1),
==============
{
m_ptStartDrag.x = 0;
m_ptStartDrag.y = 0;
}
// Message map and handlers
BEGIN_MSG_MAP(CTabViewImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_GETFONT, OnGetFont)
MESSAGE_HANDLER(WM_SETFONT, OnSetFont)
NOTIF