MFC BUTTON重绘

实现光标在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);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值