www.pudn.com > Clean.rar > XPButton.cpp


// XPButton.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Clean.h" 
#include "XPButton.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CXPButton 
 
CXPButton::CXPButton() 
{ 
	m_MouseFlag = FALSE; 
	lf = new LOGFONT; 
 
} 
 
CXPButton::~CXPButton() 
{ 
	delete lf; 
	m_Font->DeleteObject(); 
	 
} 
 
 
BEGIN_MESSAGE_MAP(CXPButton, CButton) 
	//{{AFX_MSG_MAP(CXPButton) 
	ON_WM_MOUSEMOVE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CXPButton message handlers 
 
 
 
void CXPButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  
{ 
	// TODO: Add your code to draw the specified item 
	CString m_Caption; 
	GetWindowText(m_Caption); 
	//重新设置按钮的字体 
    m_Font = GetFont();              
	m_Font->GetLogFont(lf); 
	lf->lfWeight = 540;              //改边字体的粗细 
    CFont * NewFont = new CFont; 
	NewFont->CreateFontIndirect(lf); 
 
	CDC * hdc = CDC::FromHandle(lpDrawItemStruct->hDC); 
    CBrush * m_brush, * m_Oldbrush, * Broderline; 
	CPen * m_Pen, * m_OldPen; 
	COLORREF m_PenColor, m_BrushColor;                   //按钮的钢笔、笔刷的颜色 
    CRect m_ButtonRect(lpDrawItemStruct->rcItem);        //取得按钮的大小 
	CRect m_Borderline(m_ButtonRect);               
	CFont * m_OldFont = (CFont * ) hdc->SelectObject(NewFont); 
    //绘制各中状态下的按钮 
    if ( (lpDrawItemStruct->itemState & ODS_FOCUS) ) 
	{ 
		m_ButtonRect.DeflateRect(1, 1);             
	} 
 
	if ((lpDrawItemStruct->itemState & ODS_DISABLED) ||  
		(!m_MouseFlag && !(lpDrawItemStruct->itemState & ODS_SELECTED)))  
	{ 
        m_PenColor = ::GetSysColor(COLOR_3DSHADOW); 
		m_BrushColor = ::GetSysColor(COLOR_3DFACE); 
		 
	} 
	else 
	{  
		COLORREF BorderColor = ::GetSysColor(COLOR_HIGHLIGHT); 
		m_PenColor = BorderColor; 
        if ((lpDrawItemStruct->itemState & ODS_SELECTED)) 
		{  
			m_BrushColor = RGB(100, 100, 205); 
			hdc->SetTextColor(RGB(240, 240, 240)); 
		} 
		else 
		{ 
			m_BrushColor = RGB(170, 213, 255); 
			hdc->SetTextColor(::GetSysColor(COLOR_BTNTEXT)); 
		} 
         
    } 
 
	if (lpDrawItemStruct->itemState & ODS_DISABLED) 
	{ 
		hdc->SetTextColor(::GetSysColor(COLOR_BTNTEXT)); 
	} 
	 
	m_Pen = new CPen; 
	m_brush = new CBrush; 
	m_Pen->CreatePen(PS_SOLID, 1, m_PenColor); 
	m_brush->CreateSolidBrush(m_BrushColor); 
	m_OldPen = (CPen * )hdc->SelectObject(m_Pen); 
	m_Oldbrush = (CBrush *)hdc->SelectObject(m_brush); 
	hdc->Rectangle(m_ButtonRect); 
	hdc->SetBkMode(TRANSPARENT); 
	hdc->DrawText(m_Caption, m_ButtonRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); 
 
	if ((lpDrawItemStruct->itemState & ODS_FOCUS)) 
	{ 
         m_ButtonRect.DeflateRect(3, 3); 
		 hdc->DrawFocusRect(m_ButtonRect);   
		 Broderline = new CBrush; 
		 Broderline->CreateSolidBrush(RGB(0, 0, 0)); 
		 hdc->FrameRect(m_Borderline, Broderline);      //绘制按钮的黑边框 
		 delete Broderline; 
	} 
	delete NewFont; 
    delete m_Pen; 
	delete m_brush; 
	hdc->SelectObject(m_OldFont); 
	hdc->SelectObject(m_OldPen); 
	hdc->SelectObject(m_Oldbrush); 
} 
 
void CXPButton::ModifiColor(COLORREF color) 
{ 
       
} 
   
 
void CXPButton::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CWnd* pCaptureWnd=GetCapture(); 
	if (pCaptureWnd != this) 
	{ 
		m_MouseFlag = TRUE; 
		SetCapture();  //加上该句可以防止当鼠标指向时发生闪烁 
		 
		Invalidate(); 
	} 
	else 
	{ 
		POINT p2 = point; 
		ClientToScreen(&p2); 
		 //返回当前鼠标下的窗口句柄,判断该句柄是否为按钮的句柄 
		CWnd* wndUnderMouse = WindowFromPoint(p2);     
		if (wndUnderMouse && wndUnderMouse->m_hWnd != this->m_hWnd){ 
			// Redraw only if mouse goes out 
			if (m_MouseFlag == TRUE){ 
				m_MouseFlag = FALSE; 
				Invalidate(); 
			} 
			// If user is NOT pressing left button then release capture! 
			if (!(nFlags & MK_LBUTTON))  
		 
 				ReleaseCapture(); 
	 	 
		} 
	} 
 
	CButton::OnMouseMove(nFlags, point); 
}