Делаю свою кнопку как ActveX элемент. Стандартный подход — это сделать как-то так
class ATL_NO_VTABLE CFixButton :
public CComObjectRootEx<CComSingleThreadModel>,
public CStockPropImpl<CFixButton, IBindableImpl<CFixButton, _DFixButton, &IID__DFixButton>, &IID__DFixButton, &LIBID_FixForms, /*wMajor =*/ 1, /*wMinor =*/ 0>,
........ (skip)
public:
СContainedWindowT<CButton> m_ctlButton;
CFixButton(): m_ctlButton(this, 1)
{
}
........ (skip)
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
m_ctlButton.Create (m_hWnd, &rc);
return S_OK;
}
В таком случае все работает великолепно.
Теперь я хочу чтобы вместо
WTL::CButton
использовался свой класс
template <class T, class TBase = ATLControls::CButton, class TWinTraits = CWinTraits<WS_CHILD | WS_VISIBLE | BS_OWNERDRAW>>
class ATL_NO_VTABLE CFooButtonImpl:
public CWindowImpl <T, TBase, TWinTraits>
{
CFooButtonImpl(){}
virtual ~CFooButtonImpl()
DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())
BEGIN_MSG_MAP(CFooButtonImpl)
MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)
END_MSG_MAP()
......(skip)
}
class CFooButton : public CFooButtonImpl<CFooButton>
{
public:
DECLARE_WND_SUPERCLASS(_T("FooButton"), GetWndClassName())
CFooButton(): CFooButtonImpl<CFooButton>()
{
}
};
Т.е. теперь вместо
СContainedWindowT<CButton> m_ctlButton;
будет использоваться
СContainedWindowT<CFooButton> m_ctlButton;
Но вот беда, в класс CFooButton не приходят сообщения, и соответственно кнопка не рисуется.
Как сделать правильно?