MFC Button控件自绘制----详细讲解

简介:     VC下的界面着实难看 有时候我们不得不自己进行控件的绘制 以前 一直不理解最近再次看了学了一遍终于明白了一点   与大家分享下...       需要源代码的Q我 寻找一起学VC的朋友     比如说   我们要改变一个编辑框的背景 我们响应WM_CTLCOLOR函数 进行OnCtlColor进行修改但是对与 Button控件就不行了 .
 

  VC下的界面着实难看 有时候我们不得不自己进行控件的绘制 以前 一直不理解最近再次看了学了一遍终于明白了一点
  与大家分享下...       需要源代码的Q我 寻找一起学VC的朋友 

   比如说


  我们要改变一个编辑框的背景 我们响应WM_CTLCOLOR函数 进行OnCtlColor进行修改但是对与 Button控件就不行了 ..
 
  这时候我们要进行自绘制    相关函数   virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

  要覆盖掉这个虚函数  并且类型要设置为 BS_OWNERDRAW 这时候 放 应用程序进行初始化界面的时候 会进入我们的

  DrawItem函数 进行控件的绘制   所以说 自绘制 就2个步骤    

  ASSERT 宏 
 
  Evaluate an expression and generate a debug report when the result is FALSE (debug version only).    
  计算表达是当结果是false的时候生成调试报告 (仅仅在debug下 )
 


  1. 类型要设置为 BS_OWNERDRAW


  2.重写 virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );函数   代码就我们自己设计了

 重绘需要的函数  注意 都是SDK中的函数
 
  BOOL DrawFrameControl(   //这个函数画一个指定类型控件的框架
  HDC hdc,     // handle to device context  DC
  LPRECT lprc, // bounding rectangle   举行区域
  UINT uType,  // frame-control type   类型
  UINT uState  // frame-control state  状态 具体看MSDN
);
  

 
int DrawText(   //在指定的矩形区域 输出文本
  HDC hDC,          // handle to DC
  LPCTSTR lpString, // text to draw
  int nCount,       // text length
  LPRECT lpRect,    // formatting dimensions
  UINT uFormat      // text-drawing options
);

COLORREF SetTextColor(  //设置指定DC的文本颜色
  HDC hdc,           // handle to DC
  COLORREF crColor   // text color
);

int FillRect(  // 用给定画刷填充矩形区域
  HDC hDC,           // handle to DC
  CONST RECT *lprc,  // rectangle
  HBRUSH hbr         // handle to brush
);


int SetBkMode(    //设置背景模式   TRANSPARENT透明
  HDC hdc,      // handle to DC
  int iBkMode   // background mode
);


typedef struct tagDRAWITEMSTRUCT {    //具体看MSDN
  UINT      CtlType;      //控件类型
  UINT      CtlID;    //id
  UINT      itemID;    //项ID 
  UINT      itemAction;  行为   
  UINT      itemState;  //状态
  HWND      hwndItem;    //控件句柄
  HDC       hDC;    //dc句柄
  RECT      rcItem;   //举行区域
  ULONG_PTR itemData;  
} DRAWITEMSTRUCT  ;

    
    Draw3dRect 
    (
  LPCRECT lpRect,   
    COLORREF clrTopLeft,
  COLORREF clrBottomRight
   );  
 此函数用于实现绘制3D矩形的位置大小,其中lpRect是填入整个3D矩形的位置大小,
  clrTopLeft和clrBottomRight分别是3D效果中左上方和右下方的颜色RGB的值。


   BOOL DrawFocusRect
    (  画一个虚线矩形
    HDC hDC,          // handle to device context
    CONST RECT* lprc  // logical coordinates
    );  
   数功能: 画一个焦点矩形。这个矩形是在标志焦点的样式中通过异或运算完成的(焦点通常用一个点线表示)。
   如用同样的参数再次调用这个函数,就表示删除焦点矩形

 


  下面是程序代码: 


   void  CBtnXiaoWei::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CString btnCaption;  //保存button标题
GetWindowText(btnCaption);  //获得button标题
CRect drawRect; //定义CRect对象
HDC dc= lpDrawItemStruct->hDC;//控件DC
CDC*pDC=CDC::FromHandle(dc);//获得CDC指针 通过 HDC
UINT nStyle=lpDrawItemStruct->CtlType;
drawRect.CopyRect(&(lpDrawItemStruct->rcItem)); //拷贝控件矩形区域到我们的CRect对象  
DrawFrameControl(dc,&drawRect,DFC_MENU,nStyle); //绘制控件框架
CBrush pBrush;//创建画刷

static int n=0;
pBrush.CreateSolidBrush(RGB(100+n,130,n)); //创建
pDC->FillRect(drawRect,&pBrush);//画矩形
pDC->SetTextColor(m_clo); //设置文本颜色


CRect textRect;//定义一个CRect用于绘制文本
textRect.CopyRect(&drawRect); //拷贝矩形区域
CSize sz=pDC->GetTextExtent(btnCaption);//获得字符串尺寸
textRect.top+=(textRect.Height()-sz.cy)/2;//调整文本位置 居中
pDC->SetBkMode(TRANSPARENT);//设置文本背景透明
pDC->DrawText(btnCaption,&textRect,DT_RIGHT|DT_CENTER|DT_BOTTOM);//绘制文本
n+=10;
}

 


void CBtnXiaoWei::SetTextColer(COLORREF clo)
{
m_clo=clo;
Invalidate(); //是局部无效引起重画
}

 

 

 

 


 

目录
相关文章
|
Kubernetes 监控 Java
【JVM故障问题排查心得】「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?
【JVM故障问题排查心得】「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?
1041 0
【JVM故障问题排查心得】「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?
|
11月前
|
安全 数据安全/隐私保护 UED
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
### HarmonyOS 5.0(Next)应用开发实战:使用ArkTS构建开箱即用的登录页面 HarmonyOS 5.0(Next)融合了美学与科技,引入“光感美学”设计理念和多设备深度协同功能。本文通过 ArkTS 构建一个简单的登录页面,展示了模块化导入、状态管理、方法封装、声明式UI构建及事件处理等最佳实践。代码实现了一个包含用户名和密码输入框及登录按钮的界面,支持错误提示和页面跳转。
971 14
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
|
11月前
|
搜索推荐 小程序 物联网
基于HarmonyOS 5.0的元服务:技术架构、应用场景与未来发展【探讨】
鸿蒙OS 5.0推出的元服务(Super Service)是一种创新的服务架构,旨在提供无缝的跨设备体验。它具备无感知启动、跨设备共享和智能推送等特点,适用于智能家居、车载系统、即时通讯等场景。与传统应用及微信小程序相比,元服务更轻量、跨平台能力强,且无需下载安装。未来,元服务将通过AI增强智能化,并扩展到更多行业,如智慧医疗、智能零售等,推动物联网和智慧城市的发展。然而,其发展仍面临平台依赖、隐私安全等挑战。
基于HarmonyOS 5.0的元服务:技术架构、应用场景与未来发展【探讨】
|
11月前
|
人工智能 数据可视化 大数据
《MaxFrame 产品评测:探索数据处理新边界》
MaxFrame是一款新兴的分布式计算框架,旨在为大数据和AI应用提供强大支持。本文通过实际操作和深入分析,全面评测MaxFrame在环境搭建、基础功能、分布式处理、AI集成等方面的表现。其优点包括易用性、强大的分布式计算能力和与主流AI框架的良好集成,但也存在社区支持薄弱、功能细节待完善等不足。未来,MaxFrame有望通过加强社区建设、优化功能和集成可视化工具,进一步提升竞争力,成为大数据和AI领域的重要工具。
209 12
|
11月前
|
机器学习/深度学习 计算机视觉
深度学习在图像识别中的应用与挑战
本文深入探讨了深度学习技术在图像识别领域的应用及其面临的挑战。通过分析深度学习模型如卷积神经网络(CNN)的工作原理,我们揭示了这些模型如何有效地处理和识别图像数据。同时,文章也指出了当前深度学习在图像识别中遇到的一些主要问题,包括过拟合、数据集偏差和模型解释性等,为读者提供了对这一领域全面而深入的理解。
|
11月前
|
前端开发 JavaScript 应用服务中间件
Nginx 支持 JavaScript:前所未有的扩展
Nginx 是全球领先的高性能 Web 服务器,以其高效的反向代理和负载均衡功能著称。近期,Nginx 正式支持 JavaScript(通过 NJS 模块),基于 V8 引擎,允许在配置中嵌入 JS 代码,极大提升了灵活性和扩展性。开发者可以使用 JavaScript 实现动态请求处理、自定义认证、复杂响应处理、中间件编写及流量控制等功能,显著降低开发和维护难度,同时保持高性能。NJS 模块的引入为 Nginx 带来了前所未有的扩展能力,适应快速变化的业务需求。
315 0
|
机器学习/深度学习 存储 算法
【数据挖掘】KNN算法详解及对iris数据集分类实战(超详细 附源码)
【数据挖掘】KNN算法详解及对iris数据集分类实战(超详细 附源码)
557 0
【数据挖掘】KNN算法详解及对iris数据集分类实战(超详细 附源码)
|
人工智能 Java C++
python入门(五) vscode配置Anaconda 环境,代码自动提示
python入门(五) vscode配置Anaconda 环境,代码自动提示
1172 0
|
Oracle 关系型数据库 开发工具
PostgreSQL插件:Oracle_fdw 编译安装
远程跨库访问Oracle神器
2390 0