www.gusucode.com > VC++按钮及美化类库-源码程序 > VC++按钮及美化类库-源码程序/code/几个按钮类/PluckButton.cpp
//Download by http://www.NewXing.com // PluckButton.cpp : implementation file // #include "stdafx.h" #include "OwnDrawButton.h" #include "PluckButton.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPluckButton CPluckButton::CPluckButton() { m_style = KEY_STYLE_DOWN; b_InRect = false; } CPluckButton::~CPluckButton() { } BEGIN_MESSAGE_MAP(CPluckButton, CButton) //{{AFX_MSG_MAP(CPluckButton) ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPluckButton message handlers void CPluckButton::PreSubclassWindow() { CButton::PreSubclassWindow(); ModifyStyle( 0, BS_OWNERDRAW ); //设置按钮属性为自画式 } void CPluckButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC *pDC = CDC::FromHandle( lpDrawItemStruct->hDC ); m_ButRect = lpDrawItemStruct->rcItem; //获取按钮尺寸 CPoint m_ptCentre = m_ButRect.CenterPoint(); //求按钮中心点 switch( m_style ) //设置箭头坐标 { case KEY_STYLE_DOWN: m_pt[0].x = m_ptCentre.x-3; m_pt[0].y = m_ptCentre.y-2; m_pt[1].x = m_ptCentre.x+4; m_pt[1].y = m_ptCentre.y-2; m_pt[2].x = m_ptCentre.x; m_pt[2].y = m_ptCentre.y+2; break; case KEY_STYLE_UP: m_pt[0].x = m_ptCentre.x-4; m_pt[0].y = m_ptCentre.y+2; m_pt[1].x = m_ptCentre.x+4; m_pt[1].y = m_ptCentre.y+2; m_pt[2].x = m_ptCentre.x; m_pt[2].y = m_ptCentre.y-3; break; case KEY_STYLE_LEFT: m_pt[0].x = m_ptCentre.x+2; m_pt[0].y = m_ptCentre.y-4; m_pt[1].x = m_ptCentre.x+2; m_pt[1].y = m_ptCentre.y+4; m_pt[2].x = m_ptCentre.x-2; m_pt[2].y = m_ptCentre.y; break; case KEY_STYLE_RIGHT: m_pt[0].x = m_ptCentre.x-1; m_pt[0].y = m_ptCentre.y-4; m_pt[1].x = m_ptCentre.x-1; m_pt[1].y = m_ptCentre.y+4; m_pt[2].x = m_ptCentre.x+3; m_pt[2].y = m_ptCentre.y; break; } int nSavedDC = pDC->SaveDC(); VERIFY( pDC ); if( !(::GetWindowLong(m_hWnd,GWL_STYLE) & WS_DISABLED) ) { if( !b_InRect ) //鼠标不在按钮上 { NormalButton( pDC ); } else //鼠标在按钮上 { PassButton( pDC ); } } pDC->RestoreDC( nSavedDC ); } //鼠标移动消息函数 void CPluckButton::OnMouseMove(UINT nFlags, CPoint point) { CButton::OnMouseMove(nFlags, point); if( !b_InRect || GetCapture()!=this ) { b_InRect = true; SetCapture(); Invalidate(); } else { CRect rc; this->GetClientRect( &rc ); if ( !rc.PtInRect(point) ) { b_InRect = false; ReleaseCapture(); Invalidate(); } } } //鼠标按下消息函数 void CPluckButton::OnLButtonDown(UINT nFlags, CPoint point) { switch( m_style ) //重置按钮风格 { case KEY_STYLE_DOWN: m_style = KEY_STYLE_UP; break; case KEY_STYLE_UP: m_style = KEY_STYLE_DOWN; break; case KEY_STYLE_LEFT: m_style = KEY_STYLE_RIGHT; break; case KEY_STYLE_RIGHT: m_style = KEY_STYLE_LEFT; break; } CButton::OnLButtonDown(nFlags, point); Invalidate(); } //画正常按钮 void CPluckButton::NormalButton(CDC *pDC) { CBrush Brush; Brush.CreateSolidBrush( RGB(178,189,200) ); pDC->SelectObject( &Brush ); pDC->Rectangle( &m_ButRect ); //画背景 Brush.Detach(); pDC->SelectStockObject( WHITE_BRUSH ); CRgn rgn; rgn.CreatePolygonRgn( m_pt, 3, ALTERNATE ); pDC->PaintRgn( &rgn ); //画箭头 } //画鼠标经过时的按钮 void CPluckButton::PassButton(CDC *pDC) { CBrush Brush; Brush.CreateSolidBrush( RGB(238,238,235) ); pDC->SelectObject( &Brush ); pDC->Rectangle( &m_ButRect ); //画背景 Brush.Detach(); pDC->SelectStockObject( BLACK_BRUSH ); CRgn rgn; rgn.CreatePolygonRgn( m_pt, 3, ALTERNATE ); pDC->PaintRgn( &rgn ); //画箭头 } ////////////////////////////////////////////////////////////////////// //接口函数 //设置按钮风格 void CPluckButton::SetPluckButStyle(int Style) { m_style = Style; } //获取按钮风格 int CPluckButton::GetPluckButStyle() { return m_style; }