www.pudn.com > pngButton(GDI+).rar > PngButton.cpp


// PngButton.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "testbutton.h" 
#include "PngButton.h" 
#include ".\pngbutton.h" 
 
 
// PngButton 
 
IMPLEMENT_DYNAMIC(PngButton, CButton) 
PngButton::PngButton() 
{ 
	m_bDisable			= FALSE; 
	m_bCursorOnButton	= FALSE; 
	m_bPress			= FALSE; 
} 
 
PngButton::~PngButton() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(PngButton, CButton) 
	ON_WM_MOUSEMOVE() 
	ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover) 
	ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave) 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_ERASEBKGND() 
END_MESSAGE_MAP() 
 
 
 
// PngButton message handlers 
 
 
void PngButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{ 
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct -> hDC); 
 
	Graphics graphics(pDC -> m_hDC); 
 
	if( m_bDisable == TRUE )     
	{ 
		; 
		graphics.DrawImage(m_btnImage,Rect(0,0,m_nSliceWidth,m_nHeight), 
			BUTTON_DISABLE * m_nSliceWidth,0,m_nSliceWidth, m_nHeight,UnitPixel,NULL,NULL,NULL); 
	} 
 
	else 
	{ 
		// click state 
		if( lpDrawItemStruct -> itemState & ODS_SELECTED ) 
		{ 
			 
			 
			graphics.DrawImage (m_btnImage,Rect( 0  ,0 , m_nSliceWidth , m_nHeight), 
				BUTTON_CLICK * m_nSliceWidth , 0  , m_nSliceWidth , m_nHeight ,UnitPixel,NULL,NULL,NULL); 
		} 
 
		// hover state 
		else if ( m_bPress) 
		{ 
			 
			graphics.DrawImage(m_btnImage, Rect( 0, 0, m_nSliceWidth, m_nHeight), 
				BUTTON_HOVER * m_nSliceWidth,0, m_nSliceWidth, m_nHeight,UnitPixel,NULL,NULL,NULL); 
 
			 
		} 
 
		// enable state 
		else 
		{ 
			 
			graphics.DrawImage(m_btnImage,Rect( 0, 0,m_nSliceWidth,m_nHeight), 
				BUTTON_ENABLE*m_nSliceWidth,0, m_nSliceWidth, m_nHeight,UnitPixel,NULL,NULL,NULL); 
		} 
	} 
 
 
	// TODO:  Add your code to draw the specified item 
} 
 
void PngButton::SetButtonImage(WCHAR* str) 
{ 
	 
	m_btnImage = new Bitmap(str);//创建BITMAP对象 
	 
 
	m_nWidth = m_btnImage -> GetWidth(); 
	m_nHeight = m_btnImage -> GetHeight(); 
 
	m_nSliceWidth = m_nWidth/4;   //图片切成四分 
 
	CWnd *pWnd = this -> GetParent(); 
	GetWindowRect( &m_rectButton ); 
	pWnd -> ScreenToClient(m_rectButton); 
	m_rectButton.right	= m_rectButton.left + m_nSliceWidth; 
	m_rectButton.bottom	= m_rectButton.top  + m_nHeight; 
	MoveWindow(m_rectButton);      //调整按钮大小以适应图片 
} 
 
void PngButton::OnMouseMove(UINT nFlags, CPoint point) 
{ 
	// TODO: Add your message handler code here and/or call default 
	if( m_bCursorOnButton == FALSE ) 
	{ 
		TRACKMOUSEEVENT tme; 
		ZeroMemory(&tme,sizeof(TRACKMOUSEEVENT)); 
		tme.cbSize = sizeof(tme); 
		tme.hwndTrack = m_hWnd; 
		tme.dwFlags = TME_LEAVE|TME_HOVER; 
		tme.dwHoverTime = 1; 
		m_bCursorOnButton = _TrackMouseEvent(&tme); 
	} 
 
	CButton::OnMouseMove(nFlags, point); 
} 
 
LRESULT PngButton::OnMouseLeave(WPARAM wparam, LPARAM lparam) 
{ 
	m_bCursorOnButton	= FALSE; 
	m_bPress	= FALSE; 
 
	Invalidate(); 
	return 0L; 
} 
 
LRESULT PngButton::OnMouseHover(WPARAM wparam, LPARAM lparam) 
{ 
	m_bPress = TRUE; 
 
	Invalidate(); 
	return 0L; 
} 
 
 
void PngButton::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
	// TODO: Add your message handler code here and/or call default 
	Invalidate(); 
 
	CButton::OnLButtonDown(nFlags, point); 
} 
 
void PngButton::OnLButtonUp(UINT nFlags, CPoint point) 
{ 
	// TODO: Add your message handler code here and/or call default 
	Invalidate(); 
	CButton::OnLButtonUp(nFlags, point); 
} 
 
LRESULT PngButton::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	// TODO: Add your specialized code here and/or call the base class 
	if (message == WM_LBUTTONDBLCLK) 
	{ 
		message = WM_LBUTTONDOWN; 
	} 
	return CButton::DefWindowProc(message, wParam, lParam);//很重要,消除双击没反应 
} 
 
BOOL PngButton::OnEraseBkgnd(CDC* pDC) 
{ 
	// TODO: Add your message handler code here and/or call default 
 
	//return CButton::OnEraseBkgnd(pDC); 
	return true; 
}