继承CStaic的。 现在捕捉不到消息。 ;(//***********************************************
#include <Commctrl.h>class COwnStatic;
typedef CWindowImpl < COwnStatic,CWindow, CWinTraits < WS_CHILD | WS_VISIBLE|BS_OWNERDRAW> > CCustStatic;
class COwnStatic: public CCustStatic
{
public:
DECLARE_WND_SUPERCLASS(NULL, _T("STATIC"))


COwnStatic()
{
m_bButtonDown = m_bTracking = false;
}

~COwnStatic()
{
}


BEGIN_MSG_MAP(COwnStatic)

MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUP)
MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)
MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
END_MSG_MAP()
       LRESULT OnMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
ATLASSERT(m_bTracking);
m_bTracking = false;
Invalidate();
return 0;
}


public:

LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
return 0;
}

LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return 1;
}

LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.

if (m_bTracking)
{
TRACKMOUSEEVENT t = 
{
sizeof(TRACKMOUSEEVENT),
TME_CANCEL | TME_LEAVE,
m_hWnd,
0
};
if (::_TrackMouseEvent(&t))
{
m_bTracking = false;
}
}


m_bButtonDown = true;

bHandled = false;

return 0;
}
LRESULT OnLButtonUP(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
m_bButtonDown = false;
bHandled = false;
return 0;
}

LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
if ((m_bButtonDown) &&(::GetCapture() == m_hWnd))
{
POINT p2;
p2.x = LOWORD(lParam);
p2.y = HIWORD(lParam);

::ClientToScreen(m_hWnd, &p2);
HWND mouse_wnd = ::WindowFromPoint(p2);

bool pressed = ((GetState() & BST_PUSHED) == BST_PUSHED);
bool need_pressed = (mouse_wnd == m_hWnd);
if (pressed != need_pressed)
{
SetState(need_pressed ? TRUE : FALSE);
Invalidate();
}
}
else 
{
if (!m_bTracking)
{
TRACKMOUSEEVENT t = 
{
sizeof(TRACKMOUSEEVENT),
TME_LEAVE,
m_hWnd,
0
};
if (::_TrackMouseEvent(&t))
{
m_bTracking = true;
Invalidate();
}
}
}
bHandled = false;
return 0;
}


UINT GetState() const
{
ATLASSERT(::IsWindow(m_hWnd));
return (UINT)::SendMessage(m_hWnd, BM_GETSTATE, 0, 0L);
}

void SetState(BOOL bHighlight)
{
ATLASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWnd, BM_SETSTATE, bHighlight, 0L);
}

private:
int m_nBorder;
HBITMAP m_bmpNormal, m_bmpDown, m_bmpOver;
short m_DrawMode;
BOOL m_bTracking;
BOOL m_bButtonDown;


LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
if (::GetCapture() == m_hWnd)
{
::ReleaseCapture();
ATLASSERT(!m_bTracking);
m_bButtonDown = false;
ATLTRACE("\nKillFocus");
}
bHandled = false;
return 0;
}
};