#pragma once
template<class BaseClass>class CTrackControl : public BaseClass
{
public:
CTrackControl(){ m_bTracking=m_bHover=FALSE;}
virtual ~CTrackControl() {}
BOOLEAN IsHover(){ return m_bHover; }
public:
virtual void OnHoverEnter()=0;virtual void OnHoverLeave()=0;
protected:
virtual LRESULT WindowProc(UINT nMessage, WPARAM wParam, LPARAM lParam)
{LRESULT nResult=BaseClass::WindowProc(nMessage,wParam,lParam);
switch(nMessage)
{
case WM_MOUSEMOVE:
{
if (!m_bTracking)
{
TRACKMOUSEEVENT Tme;
Tme.cbSize = sizeof(Tme);
Tme.hwndTrack = GetSafeHwnd();
Tme.dwFlags = TME_LEAVE|TME_HOVER;
Tme.dwHoverTime = 1;
if (_TrackMouseEvent(&Tme))
m_bTracking=TRUE;
}
break;
}
case WM_MOUSEHOVER:
m_bHover=TRUE;
OnHoverEnter();
break;
case WM_MOUSELEAVE:
m_bTracking=m_bHover=FALSE;
OnHoverLeave();
break;
}
return nResult;
}
private:
BOOLEAN m_bTracking;
BOOLEAN m_bHover;
};