📄 xpbutton.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 + -