⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xpbutton.cpp

📁 网络家电
💻 CPP
字号:

#include "stdafx.h"
#include "resource.h"
#include <mmsystem.h>
#include "XPButton.h"

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

BOOL g_bSoundPrompt = FALSE;

/********************************************************************************
* Function Type	:	global
* Parameter		:	None
* Return Value	:	None
* Description	:	设置鼠标为“手”的形状
*********************************************************************************/
void SetCursorHand()
{
	// Get the windows directory
	CString strWndDir;
	GetWindowsDirectory(strWndDir.GetBuffer(MAX_PATH), MAX_PATH);
	strWndDir.ReleaseBuffer();
	
	strWndDir += _T("\\winhlp32.exe");
	// This retrieves cursor #106 from winhlp32.exe, which is a hand pointer
	HMODULE hModule = LoadLibrary(strWndDir);
	HCURSOR hCursor = NULL;
	if (hModule)
	{
		hCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
	}
	FreeLibrary(hModule);
	::SetCursor ( hCursor );
}

/////////////////////////////////////////////////////////////////////////////
// CXPButton

CXPButton::CXPButton()
{
	m_bIsMouseMove = 0;
	m_bEnable = TRUE;
	m_bDrawItem = FALSE;
	m_bChangeMouse = FALSE;

	// 按钮能用时的颜色
	m_NormalTextColor	= RGB(198, 98, 45);
	m_SelectTextColor	= RGB(215, 196, 28);
	m_ActiveTextColor	= RGB(255, 255, 255);

	m_ActiveColor		= RGB(255, 120, 80);

	m_NormalColorTop	= RGB(255, 255, 255);
	m_NormalColorBottom = RGB(0, 128, 255);

	m_FrameColor		= RGB(0, 64, 128);
	m_FrameHeight		= RGB(230, 230, 230);
	m_FrameShadow		= RGB(128, 128, 128);

	// 按钮不能用时的颜色
	m_DisbleTextColor			= RGB(13, 32, 111);

	m_DisbleNormalColorTop		= RGB(255, 255, 255);
	m_DisbleNormalColorBottom	= RGB(50, 50, 50);

	m_unMsg_LBUTTONUP = WM_NULL;
	m_pWndRecvMsg = NULL;

	OSVERSIONINFO osinfo;
	osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	VERIFY ( GetVersionEx(&osinfo) );
	if ( osinfo.dwPlatformId == VER_PLATFORM_WIN32_NT )
	{
		m_bDrawItem = TRUE;
		m_bChangeMouse = TRUE;
	}
}

CXPButton::~CXPButton()
{
}

BEGIN_MESSAGE_MAP(CXPButton, CButton)
	//{{AFX_MSG_MAP(CXPButton)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONDBLCLK()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CXPButton message handlers

void CXPButton::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
	m_bEnable = IsWindowEnabled();
	//*
	CDC* pDC      = CDC::FromHandle(lpDrawItemStruct->hDC);
	DWORD nState  = lpDrawItemStruct->itemState;
	DWORD nAction = lpDrawItemStruct->itemAction; 
	CRect rc	  = lpDrawItemStruct->rcItem;
	UINT uStyle   = DFCS_BUTTONPUSH;

	pDC->SetBkMode(TRANSPARENT);
	CString strText;
	GetWindowText(strText);

	COLORREF crNormalTop = m_bEnable ? m_NormalColorTop : m_DisbleNormalColorTop ;
	COLORREF crNormalBottom = m_bEnable ? m_NormalColorBottom : m_DisbleNormalColorBottom ;
	
	if( nState & ODS_SELECTED )
	{
		m_bIsMouseMove = 0;

		DrawFace(crNormalBottom, crNormalTop, rc, rc, pDC);
		DrawFrame(m_FrameShadow, m_FrameShadow, m_FrameColor, rc, pDC);	
		//pDC->Draw3dRect(rc, RGB(0,0,0), RGB(0,0,0));

		pDC->SetTextColor(m_SelectTextColor);
	}
	else //Normal
	{
		DrawFace(crNormalTop, crNormalBottom, rc, rc, pDC);
		DrawFrame(m_FrameHeight, m_FrameShadow, m_FrameColor, rc, pDC);

		pDC->SetTextColor ( m_bEnable ? m_NormalTextColor : m_DisbleTextColor );
	}

	if( m_bIsMouseMove )
	{
		CRect rc2(rc);
		rc2.DeflateRect(2, 2, 2, 2);

		DrawFace(RGB(GetRValue(m_ActiveColor), GetGValue(m_ActiveColor)+100, GetBValue(m_ActiveColor)+100),
			m_ActiveColor, rc, rc, pDC);
		DrawFace(crNormalTop, crNormalBottom, rc2, rc, pDC);

		CBrush NullBrush;
		NullBrush.CreateStockObject(NULL_BRUSH);
		CBrush* pOldBrush = pDC->SelectObject(&NullBrush);
		
		CPen Pen;
		Pen.CreatePen(PS_SOLID, 1, m_FrameColor);
		CPen* pOldPen = pDC->SelectObject(&Pen);
		rc.InflateRect(1,1,1,1);
		pDC->RoundRect(rc, CPoint(3, 3));
		//rc.DeflateRect(1, 1, 1, 1); 
		//pDC->Draw3dRect(rc, HeightLight, ShadowLight);
		
		pDC->SelectObject(pOldPen);
		pDC->SelectObject(pOldBrush);

		pDC->SetTextColor(m_ActiveTextColor);
	}
	
	pDC->DrawText(strText, strText.GetLength(), 
		&lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
	//*///
}

void CXPButton::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if ( m_bChangeMouse ) SetCursorHand();
	if( m_bIsMouseMove == 0 )
	{
		m_bIsMouseMove = 1;
		Invalidate();
		
		TRACKMOUSEEVENT trackmouseevent;
		trackmouseevent.cbSize = sizeof(trackmouseevent);
		trackmouseevent.dwFlags = TME_LEAVE;
		trackmouseevent.hwndTrack = GetSafeHwnd();
		trackmouseevent.dwHoverTime = HOVER_DEFAULT;
		_TrackMouseEvent(&trackmouseevent);
	}
	
	CButton::OnMouseMove(nFlags, point);
}

LONG CXPButton::OnMouseLeave(WPARAM, LPARAM)
{
	m_bIsMouseMove = 0;
	Invalidate();

	return 0;
}

void CXPButton::PreSubclassWindow() 
{
	if ( m_bDrawItem )
	{
		UINT nBS = GetButtonStyle();
		// Add BS_OWNERDRAW style
		SetButtonStyle(nBS | BS_OWNERDRAW);
	}

	CButton::PreSubclassWindow();
}

void CXPButton::DrawFace(COLORREF Top, COLORREF Bottom, CRect& rc, CRect CalRc, CDC* pDC)
{
	CPen Pen;
	CPen* pOldPen = pDC->SelectObject(&Pen);
	
	int R, G, B;
	R = (GetRValue(Top) - GetRValue(Bottom)) / CalRc.Height();
	G = (GetGValue(Top) - GetGValue(Bottom)) / CalRc.Height();
	B = (GetBValue(Top) - GetBValue(Bottom)) / CalRc.Height();
	
	//R = R>0 ? R : -R;
	//G = G>0 ? G : -G;
	//B = B>0 ? B : -B;

	int ColR = GetRValue(Top), ColG = GetGValue(Top), ColB = GetBValue(Top);
	COLORREF ColMax = Top > Bottom ? Top : Bottom;
	COLORREF ColMin = Top > Bottom ? Bottom: Top;

	for(int i=0; i<rc.Height(); i++)
	{
		ColR -= R;
		ColG -= G;
		ColB -= B;

		/*
		if( ColR >= GetRValue(ColMax) || ColR <= GetRValue(ColMin) ||
			ColG >= GetGValue(ColMax) || ColG <= GetGValue(ColMin) ||
			ColB >= GetBValue(ColMax) || ColB <= GetBValue(ColMin) )
		{
			R = G = B = 0;
		}///*/


		Pen.DeleteObject();
		Pen.CreatePen(PS_SOLID, 1, RGB(ColR, ColG, ColB));
				
		pDC->SelectObject(&Pen);
		
		pDC->MoveTo(rc.left, rc.top+i);
		pDC->LineTo(rc.right, rc.top+i);
	}

	pDC->SelectObject(pOldPen);
}

void CXPButton::DrawFrame(COLORREF HeightLight, COLORREF ShadowLight, COLORREF FrameColor, CRect& rc, CDC* pDC)
{
	CBrush NullBrush;
	NullBrush.CreateStockObject(NULL_BRUSH);
	CBrush* pOldBrush = pDC->SelectObject(&NullBrush);

	CPen Pen;
	Pen.CreatePen(PS_SOLID, 1, FrameColor);
	CPen* pOldPen = pDC->SelectObject(&Pen);
	
	pDC->RoundRect(rc, CPoint(3, 3));
	rc.DeflateRect(1, 1, 1, 1); 
	pDC->Draw3dRect(rc, HeightLight, ShadowLight);

	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}

void CXPButton::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	if ( m_bChangeMouse ) SetCursorHand();	
	CButton::OnLButtonDblClk(nFlags, point);
}

void CXPButton::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if ( m_bChangeMouse ) SetCursorHand();
	CButton::OnLButtonDown(nFlags, point);
}

void CXPButton::OnLButtonUp(UINT nFlags, CPoint point ) 
{
	if ( m_bChangeMouse ) SetCursorHand();
	if ( m_unMsg_LBUTTONUP != WM_NULL &&
		m_pWndRecvMsg != NULL &&
		::IsWindow ( m_pWndRecvMsg->GetSafeHwnd() ) )
	{
		m_pWndRecvMsg->SendMessage ( m_unMsg_LBUTTONUP, nFlags, 0 );
	}

	CButton::OnLButtonUp(nFlags, point);
}

void CXPButton::OnRButtonDblClk(UINT nFlags, CPoint point) 
{
	if ( m_bChangeMouse ) SetCursorHand();
	CButton::OnRButtonDblClk(nFlags, point);
}

void CXPButton::OnRButtonDown(UINT nFlags, CPoint point) 
{
	if ( m_bChangeMouse ) SetCursorHand();
	CButton::OnRButtonDown(nFlags, point);
}

void CXPButton::OnRButtonUp(UINT nFlags, CPoint point) 
{
	if ( m_bChangeMouse ) SetCursorHand();
	CButton::OnRButtonUp(nFlags, point);
}

BOOL CXPButton::EnableWindow(BOOL bEnable/*=TRUE*/)
{
	m_bEnable = bEnable;
	return CButton::EnableWindow ( bEnable );
}

void CXPButton::SetMsgTransfer(UINT Msg, CWnd *pRecvMsgWnd)
{
	m_unMsg_LBUTTONUP = Msg;
	m_pWndRecvMsg = pRecvMsgWnd;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -