之前一直使用BCB实现界面,现项目需要专用VS,用起来真感觉有点麻烦,为了区别鼠标是否已经按下或弹起状态,弄个Button,参考了好多资料,折腾了许久。
SHOW 一下鼠标按下前和鼠标弹起来后的颜色变化,调试结果。
鼠标 按下
鼠标 弹起后
实现思路过程:重载DrawItem函数,实现重绘Button。
void CBtnClr::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);//得到绘制的设备环境CDC
VERIFY(lpDrawItemStruct->CtlType==ODT_BUTTON);
const int bufSize = 256;
TCHAR buffer[bufSize];
GetWindowText(buffer, bufSize);
//CString strText;
//GetWindowText(strText);
int size=strlen(buffer);
DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct-
>rcItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);//绘制文字
SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);//透明
if (lpDrawItemStruct->itemState&ODS_SELECTED)//当按下按钮时的处理
{重绘整个控制
CBrush brush(m_DownColor);
dc.FillRect(&(lpDrawItemStruct->rcItem),&brush);//利用画刷brush,填充矩形框
DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct-
>rcItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);
SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);
}
else//当按钮不操作或者弹起时
{
CBrush brush(m_UpColor);
dc.FillRect(&(lpDrawItemStruct->rcItem),&brush);//
DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct-
>rcItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);
SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);
}
if ((lpDrawItemStruct->itemState&ODS_SELECTED)&&(lpDrawItemStruct->itemAction &
(ODA_SELECT|ODA_DRAWENTIRE)))
{//选中了本控件,高亮边框
COLORREF fc=RGB(255-GetRValue(m_UpColor),255-GetGValue(m_UpColor),255-GetBValue
(m_UpColor));
CBrush brush(fc);
dc.FrameRect(&(lpDrawItemStruct->rcItem),&brush);//用画刷brush,填充矩形边框
}
if (!(lpDrawItemStruct->itemState &ODS_SELECTED) &&(lpDrawItemStruct->itemAction &
ODA_SELECT))
{
CBrush brush(m_UpColor);
dc.FrameRect(&lpDrawItemStruct->rcItem,&brush);//}
dc.Detach();
}
}