15,979
社区成员
发帖
与我相关
我的任务
分享
void CButtonHot::PreSubclassWindow()
{
//ModifyStyle( 0, BS_OWNERDRAW);
SetTimer(1,10,NULL); //设置定时器
CButton::PreSubclassWindow();
}
void CButtonHot::OnTimer(UINT nIDEvent)
{
CPoint point;
GetCursorPos(&point); //获得鼠标位置
CRect rcWnd;
GetWindowRect(&rcWnd); //获得按钮区域
if(rcWnd.PtInRect(point)) //判断当前鼠标是否在按钮上
{
if(m_bInRect) //判断鼠标是否一直在按钮上
goto END;
else //鼠标移动到按钮上
{
m_bInRect= TRUE;
Invalidate();
}
}
else //不在按钮区域内
{
if(!m_bInRect) //判断鼠标一直在按钮外
goto END;
else //鼠标移动到按钮外
{
Invalidate();
m_bInRect= FALSE;
}
}
END: CButton::OnTimer(nIDEvent);
}
然后结合lpDrawItemStruct->itemState来绘图即可
UINT state = lpDrawItemStruct->itemState
if(state & ODS_DISABLED)
{
}
else if(state & ODS_SELECTED)
{
}
else if(m_bInRect) //鼠标移动到按钮上
{
}
else //鼠标在按钮外
{
}
UINT state = lpDrawItemStruct->itemState
if(state & ODS_DISABLED)
{
}
else if(state & ODS_SELECTED)
{
}
if(state & ODS_FOCUS)
{
CRect FocTect;
GetClientRect(&FocTect);
FocTect.DeflateRect(2,2,2,2);
::DrawFocusRect(lpDrawItemStruct->hDC,&FocTect); //HDC hDC=CreateCompatibleDC(lpDrawItemStruct->hDC);
lpDrawItemStruct->itemAction = ODA_FOCUS ;
}
这样就不要你去处理WM_LBUTTONDOWN等消息去手动设置相应的状态,MFC对这些已经进行过了封装,也就说你没有必要去做重复的工作
如果你的button派生于CWnd或者Win32裸写,就没有DrawItem这么一说了,只能OnPaint,所有的状态也都需要自行处理(当然,这一点偏离了你的主题,我提一下你只要知道即可)