实现光标在button上,以及鼠标左键按下 和左键弹起时显示不同颜色
(1)从MFC的BUTTON派生出自己的button类,CMyButton。
(2)重载button类的PreSubClassWindows函数,修改button的自绘设置,如下
void PreSunClassWindows()
{
SetButtonStyle(GetButtonStyle() | BS_OWNERDRAW);
//CButton::PreSunClassWindows();
}
(3)添加成员变量 (在构造函数内初始化为FALSE)
BOOL = m_bOver; //光标在button上
BOOL = m_bDown; //鼠标左键按下
(4)重载OnMouseMove()、OnTimer()、DrawItem()、OnLButtonDown()、OnLButtonUp()函数(5)在OnMouseMove函数内添加如下code:
if(!m_bOver)
{
m_bOver = TRUE;
SetTimer(1,100,NULL);
Invalidate();
}
(6)在OnTimer函数内添加如下Code:
switch(nEventID)
{
CPoint point(GetMessagePos())
CRECT rc;
case 1:
{
ScreenToClient(&point);
GetClientRect(rc);
if(!rc.PtInRect(point))
{
m_bOver = FALSE;
KillTimer(1);
Invalidate();
}
}
break;
default:
break;
}
(7)在OnLButtonDown函数内添加如下Code:
if(!m_bDown)
{
killTimer(1);
m_bOver = FALSE;
m_bDown = TRUE;
Invalidate();
}
(8)在OnLButtonUp函数内添加如下Code:
if(m_bDown)
{
m_bOver = TRUE;
m_bDown = FALSE;
SetTimer(1,100,NULL);
Invalidate();
}
(8)在drawItem内添加如下Code:
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rc = lpDrawItemStruct->rcItem;
UINT state = lpDrawItemStruct->itemState;
CString text;
GetWindowText(text);
OutputDebugString(text);
if(state & ODS_SELECTED)
{
pDC->DrawFrameControl(rc, DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_PUSHED);
}
else
{
pDC->DrawFrameControl(rc , DFC_BUTTON, DFCS_BUTTONPUSH);
}
rc.DeflateRect( CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)));
if (m_IsOverCtrl)
{
pDC->FillSolidRect(rc, RGB(255, 255, 0)); // yellow
}
if (m_isLBtnDown)
{
pDC->FillSolidRect(rc, RGB(255, 0, 0)); // yellow
}
if(!text.IsEmpty())
{
CSize size = pDC->GetTextExtent(text);
CPoint pt(rc.CenterPoint().x-size.cx/2, rc.CenterPoint().y - size.cy/2);
if(state & ODS_SELECTED)
pt.Offset(1, 1);
int mode = pDC->SetBkMode(TRANSPARENT);
if(state & ODS_DISABLED)
pDC->DrawState(pt, size, text, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
else
pDC->TextOut(pt.x, pt.y, text);
pDC->SetBkMode(mode);
}