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

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

#include "stdafx.h"
#include "OwnDrawButton.h"
#include "TitleBox.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTitleBox

CTitleBox::CTitleBox()
{
	m_ForeColor = RGB(0,0,0);			//文字颜色
	m_BkColor = RGB(177,195,217);		//背景色
	m_butStatus = BUT_STATUS_DOWN;		//按钮状态
	b_InRect = false;			//鼠标进入标志
	b_Click = false;			//单击标志
}

CTitleBox::~CTitleBox()
{
}


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

/////////////////////////////////////////////////////////////////////////////
// CTitleBox message handlers

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

void CTitleBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)		//由ClassWizard生成
{
	CDC *pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
	CRect m_butRect = lpDrawItemStruct->rcItem;		//获取按钮尺寸
	GetWindowText( m_strText );						//获取按钮文本
	CPoint m_Center = m_butRect.CenterPoint();		//求按钮中心点
	int nSavedDC = pDC->SaveDC();
	VERIFY( pDC );

	pDC->FillSolidRect( &m_butRect, m_BkColor );	//画按钮背景
	CPen bkPen;
	bkPen.CreatePen( PS_SOLID, 2, RGB(227,233,241) );
	pDC->SelectObject( &bkPen );
	pDC->MoveTo( m_butRect.left, m_butRect.top+2 );
	pDC->LineTo( m_butRect.right, m_butRect.top+2 );
	pDC->MoveTo( m_butRect.left, m_butRect.bottom-2 );
	pDC->LineTo( m_butRect.right, m_butRect.bottom-2 );

	CBitmap m_Bmp;									//画按钮左边的位图
	CPoint pt;
	m_Bmp.LoadBitmap( IDB_BITMAP1 );
	pt.x = m_butRect.left;
	pt.y = m_butRect.top+(m_butRect.Height()-16)/2;
	CDC dcMem;
	dcMem.CreateCompatibleDC( pDC );
	dcMem.SelectObject(&m_Bmp[0]);
	pDC->BitBlt( pt.x, pt.y, 16, 16, &dcMem, 0, 0, SRCAND );
	dcMem.DeleteDC();

	POINT  m_pt[3];		//箭头坐标
	pt.x = m_butRect.left+22;						//画箭头
	pt.y = m_butRect.top+m_butRect.Height()/2;
	switch( m_butStatus )
	{
	case BUT_STATUS_DOWN:
		m_pt[0].x = pt.x-5;
		m_pt[0].y = pt.y-3;
		m_pt[1].x = pt.x+6;
		m_pt[1].y = pt.y-3;
		m_pt[2].x = pt.x;
		m_pt[2].y = pt.y+3;
		break;
	case BUT_STATUS_RIGHT:
		m_pt[0].x = pt.x;
		m_pt[0].y = pt.y-6;
		m_pt[1].x = pt.x+6;
		m_pt[1].y = pt.y;
		m_pt[2].x = pt.x;
		m_pt[2].y = pt.y+6;
		break;
	}
	CBrush Brush;
	Brush.CreateSolidBrush( m_ForeColor );
	pDC->SelectObject( &Brush );
	CRgn rgn;
	rgn.CreatePolygonRgn( m_pt, 3, ALTERNATE );
	pDC->PaintRgn( &rgn );

	CSize Extent = pDC->GetTextExtent( m_strText );		//画按钮文字
	pDC->SetTextColor( m_ForeColor );
	pDC->SetBkMode( TRANSPARENT );
	CRect m_textRect;	//文本位置
	m_textRect.SetRect( m_butRect.left+34, m_Center.y-Extent.cy/2,
			m_butRect.left+34+Extent.cx, m_Center.y+Extent.cy/2 );
	pDC->TextOut( m_textRect.left, m_textRect.top, m_strText );
	m_InvalRect.SetRect( m_textRect.left-17, m_textRect.top,
		m_textRect.right, m_textRect.bottom+2 );	//有效区:包括箭头和文字
	
	if( b_InRect )										//鼠标进入时,在文字下加划线
	{
		CPen bkPen;
		bkPen.CreatePen( PS_SOLID, 1, m_ForeColor );
		pDC->SelectObject( &bkPen );
		pDC->MoveTo( m_textRect.left, m_textRect.bottom+1 );
		pDC->LineTo( m_textRect.right, m_textRect.bottom+1 );
	}
	
	pDC->RestoreDC( nSavedDC );
}
//鼠标移动消息函数
void CTitleBox::OnMouseMove(UINT nFlags, CPoint point) 		//由ClassWizard生成
{
	CButton::OnMouseMove(nFlags, point);
	if( !b_InRect )
	{
		if ( m_InvalRect.PtInRect(point) )		//鼠标进入有效区
		{
			b_InRect = true;
			InvalidateRect( &m_InvalRect, false );	//重绘按钮
		}
	}
	if( b_InRect )
	{
		if ( !m_InvalRect.PtInRect(point) )		//鼠标离开有效区
		{
			b_InRect = false;
			InvalidateRect( &m_InvalRect, false );	//重绘按钮
		}
	}
}
//鼠标单击消息函数
void CTitleBox::OnLButtonDown(UINT nFlags, CPoint point) 		//由ClassWizard生成
{
	CButton::OnLButtonDown(nFlags, point);
	if( b_InRect )		//只有在有效区单击才响应
	{
		switch( m_butStatus )		//更改按钮状态
		{
		case BUT_STATUS_DOWN:
			m_butStatus = BUT_STATUS_RIGHT;
			break;
		case BUT_STATUS_RIGHT:
			m_butStatus = BUT_STATUS_DOWN;
			break;
		}
		InvalidateRect( &m_InvalRect, false );	//重绘按钮
		b_Click = true;			//单击标志
	}
}

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

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

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

//获取按钮状态
int CTitleBox::GetButStatus()
{
	return m_butStatus;
}

//设置按钮状态
void CTitleBox::SetButStatus(int Status)
{
	m_butStatus = Status;
	InvalidateRect( &m_InvalRect, false );
}

//是否单击按钮有效区
BOOL CTitleBox::ClickBut()
{
	if( b_Click )
	{
		b_Click = false;
		return true;
	}
	return false;
}