#include "stdafx.h"
#include "ColorButton.h"
// ColorButton.cpp
IMPLEMENT_DYNAMIC(CColorButton, CButton)
CColorButton::CColorButton()
: m_clrBack { 0xF08C3A, 0xEF9A56, 0xEA7C22, 0xBEBEBE }
, m_clrBorder{ 0xF08C3A, 0xEF9A56, 0xEA7C22, 0xBEBEBE }
, m_clrText { 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF }
{
}
CColorButton::~CColorButton()
{
}
BEGIN_MESSAGE_MAP(CColorButton, CButton)
//{{AFX_MSG_MAP(CColorButton)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHOver)
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_WM_ENABLE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CColorButton::PreSubclassWindow()
{
ModifyStyle(0, BS_OWNERDRAW);
if (NULL != GetSafeHwnd())
{
if (!(GetButtonStyle() & WS_CLIPSIBLINGS))
SetWindowLong(GetSafeHwnd(), GWL_STYLE, GetWindowLong(GetSafeHwnd(),GWL_STYLE) | WS_CLIPSIBLINGS);
}
CButton::PreSubclassWindow();
}
void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(lpDrawItemStruct)
{
Draw(lpDrawItemStruct->hDC);
}
}
void CColorButton::Draw(HDC hdc)
{
CDC DstDC;
DstDC.Attach(hdc);
//客户区位置
CRect rcClient;
GetClientRect(&rcClient);
//双缓冲绘图
{
CMemDC memDC(DstDC, rcClient);
CDC *pDC = &memDC.GetDC();
//填充背景色
pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &DstDC, 0, 0, SRCCOPY);
pDC->SetStretchBltMode(HALFTONE);
CBrush brush(m_clrBack[m_status]);
CPen pen(PS_SOLID, 1, m_clrBorder[m_status]);
CBrush* pBrushold = pDC->SelectObject(&brush);
CPen* pPenold = pDC->SelectObject(&pen);
pDC->RoundRect(&rcClient, CPoint(2, 2));
pDC->SetBkColor(m_clrBack[m_status]);
pDC->SetTextColor(m_clrText[m_status]);
CString sText = _T("");
GetWindowText(sText);
CFont* pFontOld = pDC->SelectObject(GetFont());
pDC->DrawText(sText, &rcClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
pDC->SelectObject(pFontOld);
pDC->SelectObject(pPenold);
pDC->SelectObject(pBrushold);
}
}
BOOL CColorButton::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
void CColorButton::OnPaint()
{
CButton::OnPaint();
}
void CColorButton::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bTracked) {
TRACKMOUSEEVENT tme;
ZeroMemory(&tme, sizeof(TRACKMOUSEEVENT));
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.dwHoverTime = 1;
tme.hwndTrack = this->GetSafeHwnd();
if (::_TrackMouseEvent(&tme))
m_bTracked = true;
}
CButton::OnMouseMove(nFlags, point);
}
void CColorButton::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_status != CS_Click)
{
m_status = CS_Click;
Invalidate();
}
CButton::OnLButtonDown(nFlags, point);
}
void CColorButton::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_status != CS_Hover)
{
m_status = CS_Hover;
Invalidate();
}
CButton::OnLButtonUp(nFlags, point);
}
LRESULT CColorButton::OnMouseHOver(WPARAM wParam, LPARAM lParam)
{
if (m_status != CS_Hover)
{
m_status = CS_Hover;
Invalidate();
}
return 0;
}
LRESULT CColorButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bTracked = false;
if(CS_Disable != m_status)
m_status = CS_Normal;
Invalidate();
return 0;
}
void CColorButton::OnEnable(BOOL bEnable)
{
m_status = bEnable ? CS_Normal : CS_Disable;
Invalidate();
CButton::OnEnable(bEnable);
}