WTL ActiveX. Своя кнопка
От: SаNNy Россия  
Дата: 01.11.10 15:34
Оценка:
Делаю свою кнопку как 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 не приходят сообщения, и соответственно кнопка не рисуется.
Как сделать правильно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.