MyStaticCtrl

 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;
}

 

测试效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值