MyStaticCtrl

来源:互联网 发布:史上最全数据库汇总 编辑:程序博客网 时间:2024/06/01 09:15

 MyStaticCtrl.h

#ifndef __MyStaticCtrl_h__#define __MyStaticCtrl_h__class CMyStaticCtrl : public CStatic{public:CMyStaticCtrl();~CMyStaticCtrl();public:COLORREFGetNormalTextColor() const { return _NormalTextColor; }COLORREFGetActiveTextColor() const { return _ActiveTextColor; }CFont*GetFont() { return &_Font; }HCURSORGetCursor() 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_msgvoid 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 );elsedc.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;}

 

测试效果:

原创粉丝点击