VS2010下如何改变Button颜色、背景、边框
2015-06-01 10:52
417 查看
之前一直使用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();
}
}
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();
}
}
相关文章推荐
- xbmc遥控音量加处理过程总结
- WEB安全之SQL注入
- SAP ERP项目各模块设计重点
- VB.net进阶培训及阶段总结
- What, exactly, is a Product Manager?
- sparkshell里的wordcount
- Linux基础:进程管理
- 如何在程序中写log日志(定义log级别:error,warn, info, debug; 宏定义打印不同级别的日志; 程序中引用宏定义即可)
- CSS阴影效果(Box-shadow)用法趣味讲解
- Spring3 MVC 注解
- 函数指针、函数对象、仿函数比较与入门
- 初识热仿真的一些记录001
- maven安装及maven项目导入流程
- 使用 Git Hooks 实现自动项目部署
- PHP中使用cURL实现Get和Post请求的方法
- LeetCode 203:Remove Linked List Elements
- Linux下搭建Cortex-M嵌入式开发环境
- LINUX常用查看信息集
- minicom安装与使用
- Android Studio 插件