MyStaticCtrl.h
#ifndef __MyStaticCtrl_h__
#define __MyStaticCtrl_h__
class CMyStaticCtrl : public CStatic
{
public:
CMyStaticCtrl();
~CMyStaticCtrl();
public:
COLORREF GetNormalTextColor () const { return _NormalTextColor; }
COLORREF GetActiveTextColor () const { return _ActiveTextColor; }
CFont* GetFont () { return &_Font; }
HCURSOR GetCursor () const { return _Cursor; }
void SetNormalTextColor( COLORREF clr ) {
_NormalTextColor = clr;
InvalidateRect( NULL );
}
void SetActiveTextColor( COLORREF clr ) {
_ActiveTextColor = clr;
InvalidateRect( NULL );
}
void SetFont(CFont* pFont, BOOL bRedraw = TRUE ) {
LOGFONT lf;
pFont->GetLogFont( &lf );
lf.lfUnderline = TRUE;
if( _Font.m_hObject )
_Font.DeleteObject();
_Font.CreateFontIndirect( &lf );
InvalidateRect( NULL );
}
void SetCursor( HCURSOR hCursor ) {
_Cursor = hCursor;
}
protected:
COLORREF _NormalTextColor;
COLORREF _ActiveTextColor;
BOOL _IsActive;
BOOL _IsHover;
CFont _Font;
HCURSOR _Cursor;
protected:
virtual void PreSubclassWindow();
DECLARE_MESSAGE_MAP()
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnPaint();
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
};
#endif // __MyStaticCtrl_h__
MyStaticCtrl.cpp
#include "stdafx.h"
#include "MyStaticCtrl.h"
#include "resource.h"
CMyStaticCtrl::CMyStaticCtrl()
{
_NormalTextColor = RGB( 0, 0, 255 );
_ActiveTextColor = RGB( 128, 0, 168 );
_IsActive = FALSE;
_IsHover = FALSE;
_Cursor = NULL;
}
CMyStaticCtrl::~CMyStaticCtrl()
{
if( _Font.m_hObject )
_Font.DeleteObject();
}
BEGIN_MESSAGE_MAP(CMyStaticCtrl, CStatic)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_PAINT()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()
void CMyStaticCtrl::PreSubclassWindow()
{
DWORD dwStyle = GetStyle();
::SetWindowLong( m_hWnd, GWL_STYLE, dwStyle | SS_NOTIFY );
_Font.CreateFont( 14, 0, 0, 0, FW_NORMAL, FALSE, TRUE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, _T("宋体") );
SetFont( &_Font );
_Cursor = AfxGetApp()->LoadCursor(IDC_CURSOR_HAND);
CStatic::PreSubclassWindow();
}
void CMyStaticCtrl::OnPaint()
{
CPaintDC dc(this);
dc.SetBkMode( TRANSPARENT );
if( _IsActive )
dc.SetTextColor( _ActiveTextColor );
else
dc.SetTextColor( _NormalTextColor );
CRect rc;
GetClientRect( &rc );
CString str;
GetWindowText( str );
dc.SelectObject( &_Font );
dc.DrawText( str, &rc, DT_LEFT );
}
void CMyStaticCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
CStatic::OnLButtonUp( nFlags, point );
SetCapture();
_IsActive = TRUE;
InvalidateRect(NULL);
}
void CMyStaticCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
CStatic::OnLButtonUp( nFlags, point );
ReleaseCapture();
}
void CMyStaticCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
_TrackMouseEvent(&tme);
if (_IsHover) {
CRect rect;
GetClientRect(rect);
if ( !rect.PtInRect(point) ) {
_IsHover = FALSE;
InvalidateRect( NULL );
ReleaseCapture();
}
else {
::SetCursor( _Cursor );
InvalidateRect( NULL );
}
}
else {
_IsHover = TRUE;
::SetCursor( _Cursor );
InvalidateRect( NULL );
}
CStatic::OnMouseMove(nFlags, point);
}
LRESULT CMyStaticCtrl::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
_IsHover = FALSE;
::ReleaseCapture();
InvalidateRect( NULL );
return 0;
}
测试效果: