www.pudn.com > VQ_Final.rar > MyButton.cpp


 
 
#include "afxwin.h" 
 
#include "MyButton.h" 
 
CMyButton::CMyButton() 
{ 
	m_bHover=FALSE; 
	 
} 
CMyButton::~CMyButton() 
{ 
 
} 
 
 
BEGIN_MESSAGE_MAP(CMyButton, CButton) 
	ON_WM_MOUSEMOVE() 
	ON_WM_ERASEBKGND() 
	ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave) 
	ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover) 
END_MESSAGE_MAP() 
 
void CMyButton::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	//鼠标捕捉,以得到鼠标离开和停在按钮上的消息 
	TRACKMOUSEEVENT tme; 
	tme.cbSize=sizeof(tme); 
	tme.dwFlags=TME_LEAVE|TME_HOVER; 
	tme.dwHoverTime=1; 
	tme.hwndTrack=m_hWnd; 
	_TrackMouseEvent(&tme); 
	CButton::OnMouseMove(nFlags, point); 
 
} 
//鼠标离开 
void CMyButton::OnMouseLeave(WPARAM w,LPARAM l) 
{ 
	m_bHover=FALSE; 
	Invalidate(); 
} 
//鼠标停留 
void CMyButton::OnMouseHover(WPARAM w,LPARAM l) 
{ 
	m_bHover=TRUE; 
	Invalidate(); 
} 
 
 
 
void CMyButton::PreSubclassWindow()  
{ 
	ModifyStyle(0,BS_OWNERDRAW);	//修改按钮的风格使之自绘 
	CButton::PreSubclassWindow(); 
} 
 
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpdis)  
{ 
	//按不同状态,绘制按钮,写起来得好累呀 
	 
	CDC *pDC=CDC::FromHandle(lpdis->hDC); 
	int nState=lpdis->itemState; 
	CPen pNull,pWhite,pBlack,*penOld; 
	pNull.CreateStockObject(NULL_PEN); 
	pWhite.CreatePen(PS_SOLID,3,GetSysColor(COLOR_3DHILIGHT)); 
	pBlack.CreatePen(PS_SOLID,3,GetSysColor(COLOR_BTNSHADOW)); 
	CBrush br,*brOld; 
	br.CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); 
	 
	lpdis->rcItem.right+=1; 
	lpdis->rcItem.bottom+=1; 
 
	 
	penOld=pDC->SelectObject(&pNull); 
	brOld=pDC->SelectObject(&br); 
	pDC->Rectangle(&lpdis->rcItem); 
	pDC->SelectObject(brOld); 
	pDC->SelectObject(penOld); 
 
	lpdis->rcItem.right-=2; 
	lpdis->rcItem.bottom-=2; 
 
	if (nState & ODS_SELECTED) 
	{ 
		penOld=pDC->SelectObject(&pBlack); 
		pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.top); 
		pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.top); 
		pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.top); 
		pDC->LineTo(lpdis->rcItem.left,lpdis->rcItem.bottom); 
		pDC->SelectObject(&pWhite); 
		pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.bottom); 
		pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.bottom); 
		pDC->MoveTo(lpdis->rcItem.right,lpdis->rcItem.top); 
		pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.bottom); 
		pDC->SelectObject(penOld); 
		 
		lpdis->rcItem.left+=1;	 
		lpdis->rcItem.top+=1; 
		lpdis->rcItem.right+=1; 
		lpdis->rcItem.bottom+=1; 
 
	} 
	else 
	{ 
		if (m_bHover && !(nState & ODS_DISABLED)) 
		{ 
		penOld=pDC->SelectObject(&pWhite); 
		pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.top); 
		pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.top); 
		pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.top); 
		pDC->LineTo(lpdis->rcItem.left,lpdis->rcItem.bottom); 
		pDC->SelectObject(&pBlack); 
		pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.bottom); 
		pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.bottom); 
		pDC->MoveTo(lpdis->rcItem.right,lpdis->rcItem.top); 
		pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.bottom); 
		pDC->SelectObject(penOld); 
		} 
	} 
	 
	 
	pDC->SetBkMode(TRANSPARENT); 
	CString str; 
	GetWindowText(str); 
	lpdis->rcItem.left-=1;	 
	lpdis->rcItem.top-=1; 
	lpdis->rcItem.right-=1; 
	lpdis->rcItem.bottom-=1; 
	pDC->SetTextColor(RGB(255,255,255)); 
	pDC->DrawText(str,&lpdis->rcItem,DT_CENTER|DT_SINGLELINE|DT_VCENTER); 
 
	lpdis->rcItem.left+=1;	 
	lpdis->rcItem.top+=1; 
	lpdis->rcItem.right+=1; 
	lpdis->rcItem.bottom+=1; 
	 
	pDC->SetTextColor((nState & ODS_DISABLED) ? GetSysColor(COLOR_GRAYTEXT) : GetSysColor(COLOR_BTNTEXT)); 
	pDC->DrawText(str,&lpdis->rcItem,DT_CENTER|DT_SINGLELINE|DT_VCENTER); 
	 
} 
 
BOOL CMyButton::OnEraseBkgnd(CDC* pDC)  
{ 
	return TRUE;//禁止窗口自己重画背景 
}