www.gusucode.com > VC++按钮及美化类库-源码程序 > VC++按钮及美化类库-源码程序/code/几个按钮类/MyButton.cpp

    //Download by http://www.NewXing.com
// MyButton.cpp : implementation file
//

#include "stdafx.h"
#include "OwnDrawButton.h"
#include "MyButton.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyButton

CMyButton::CMyButton()
{
	b_InRect = false;
	b_Flag = false;
	m_ForeColor = RGB(0,0,0);		//文字颜色
	m_BkColor = RGB(243,243,243);	//背景色
	m_LockForeColor = GetSysColor(COLOR_GRAYTEXT);	//锁定按钮的文字颜色
}

CMyButton::~CMyButton()
{
}


BEGIN_MESSAGE_MAP(CMyButton, CButton)
	//{{AFX_MSG_MAP(CMyButton)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyButton message handlers

void CMyButton::PreSubclassWindow() 
{
	CButton::PreSubclassWindow();
	ModifyStyle( 0, BS_OWNERDRAW );		//设置按钮属性为自画式
}

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	CDC *pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
	m_ButRect = lpDrawItemStruct->rcItem;		//获取按钮尺寸
	GetWindowText( m_strText );					//获取按钮文本
	CPoint m_ptCentre = m_ButRect.CenterPoint();	//求按钮中心点
	CSize Extent = pDC->GetTextExtent( m_strText );	//求文本尺寸
	m_textPt = CPoint( m_ptCentre.x - Extent.cx/2,
		m_ptCentre.y - Extent.cy/2 );			//设置文本坐标
	int nSavedDC = pDC->SaveDC();
	VERIFY( pDC );

	if( !(::GetWindowLong(m_hWnd,GWL_STYLE) & WS_DISABLED) )
	{
		if( !b_Flag )
		{
			NormalButton( pDC );	//画正常按钮
		}
		else
		{
			PassButton( pDC );		//画鼠标经过时的按钮
		}
	}
	else
	{
		LockButton( pDC );			//画锁定的按钮
	}

	pDC->RestoreDC( nSavedDC );
}

//鼠标移动消息函数
void CMyButton::OnMouseMove(UINT nFlags, CPoint point) 
{
	CButton::OnMouseMove(nFlags, point);

	if( !b_InRect || GetCapture()!=this )	//鼠标进入按钮
	{
		b_InRect = true;
		SetCapture();
		b_Flag = true;
		Invalidate();		//重绘按钮
	}
	else
	{
		CRect rc;
		this->GetClientRect( &rc );
		if ( !rc.PtInRect(point) )			//鼠标离开按钮
		{
			b_InRect = false;
			ReleaseCapture();
			b_Flag = false;
			Invalidate();		//重绘按钮
		}
	}
}

//鼠标按下消息函数
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point) 
{
	b_Flag = false;
	if (GetFocus()!=this)
	{
		this->SetFocus();
	}
	CButton::OnLButtonDown( nFlags, point );
	Invalidate();		//重绘按钮
}

//鼠标弹起消息函数
void CMyButton::OnLButtonUp(UINT nFlags, CPoint point) 
{
	b_Flag = true;
	if (GetFocus()!=this)
	{
		this->SetFocus();
	}
	CButton::OnLButtonUp( nFlags, point );
	Invalidate();		//重绘按钮
}

////////////////////////////////////////////////////////////////////////
//绘制按钮:

//画正常按钮
void CMyButton::NormalButton(CDC *pDC)
{
	CBrush Brush;
	Brush.CreateSolidBrush( m_BkColor );
	pDC->SelectObject( &Brush );
	pDC->RoundRect(&m_ButRect,CPoint(5,5));		//画圆角矩形的外框

	CPen Pen;
	Pen.CreatePen(PS_SOLID, 1, RGB(208,235,249) );
	pDC->SelectObject( &Pen );
	pDC->RoundRect(m_ButRect.left+2, m_ButRect.top+2,
		m_ButRect.right-2, m_ButRect.bottom-2, 5, 5);	//画圆角矩形的内边

	pDC->SetTextColor( m_ForeColor );		//画文字
	pDC->SetBkMode( TRANSPARENT );
	pDC->TextOut( m_textPt.x, m_textPt.y, m_strText );
}

//画鼠标经过时的按钮
void CMyButton::PassButton(CDC *pDC)
{
	CBrush Brush;
	Brush.CreateSolidBrush( m_BkColor );
	pDC->SelectObject( &Brush );
	pDC->RoundRect(&m_ButRect,CPoint(5,5));		//画圆角矩形的外框

	CPen Pen;
	Pen.CreatePen(PS_SOLID, 2, RGB(255,208,100) );
	pDC->SelectObject( &Pen );
	pDC->RoundRect(m_ButRect.left+2, m_ButRect.top+2,
		m_ButRect.right-2, m_ButRect.bottom-2, 5, 5);	//画圆角矩形的内边

	pDC->SetTextColor( m_ForeColor );		//画文字
	pDC->SetBkMode( TRANSPARENT );
	pDC->TextOut( m_textPt.x, m_textPt.y, m_strText );
}

//画锁定的按钮
void CMyButton::LockButton(CDC *pDC)
{
	CBrush Brush;
	Brush.CreateSolidBrush( m_BkColor );
	pDC->SelectObject( &Brush );
	pDC->RoundRect(&m_ButRect,CPoint(5,5));		//画圆角矩形的外框

	pDC->SetBkMode( TRANSPARENT );			//画文字
	pDC->SetTextColor( m_LockForeColor );
	pDC->TextOut( m_textPt.x, m_textPt.y, m_strText );
}

////////////////////////////////////////////////////////////////////////
//接口函数

//设置文本颜色
void CMyButton::SetForeColor(COLORREF color)
{
	m_ForeColor = color;
}

//设置背景颜色
void CMyButton::SetBkColor(COLORREF color)
{
	m_BkColor = color;
}