CEdit重绘的方法,我要自定义皮肤效果,不要简单换色

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

CEdit控件如果需要加入皮肤,方法有很多种,网络上最常见的是重载父类的WM_CTLCOLOR,设置CDC的背景色、文字颜色,但是这种实现有很多硬伤:

1.OnCtlColor里面的诡异判定逻辑:在该函数参数中nCtlColor指定了控件的类型,一般默认的方法是建议大家根据这个类型来对不同的控件进行处理,但是这个参数在在绘制逻辑上, 把具有ReadOnly或Disable的Edit归到了CTLCOLOR_STATIC,而其他可以编辑的Edit归类到CTLCOLOR_EDIT,因此要同时处理可以编辑的Edit、不可编辑的Edit、Static三种控件的现实的时候,特别是这3中控件都有各自的效果的时候,问题就乱了套了……

这时候,一个应急的方案是对OnCtlColor的第二个参数CWnd* pWnd对每一个控件GetClassName,然后这么判断每一个控件的类型,光看这个逻辑,就知道这么做不合适,虽然也可以明确的区分Edit和Static……

2.OnCtlColor工作在Client绘制区,碰到一个边框也有要求的,就没有办法了

3.没有对象抽象的概念,如果我在一个界面中有多种风格的CEdit控件,就要按照控件ID,逐一的处理

总之,通过OnCtlColor绘制的Edit代码没有复用性,没有可维护性,代码效率确低

 

解决方案:重载CEdit,在CEdit处理“=WM_CTLCOLOR” + “WM_NCPAINT”

强调“= WM_CTLCOLOR”是消息反射的,是WM_NCPAINT而不是WM_PAINT!

最简单的绘制,把这两个函数写好了,皮肤Edit也就可以出来了

 

时间不早了,明天写详细实现,我再弄一个实例工程

 

MFC控件开发实战:从基础原理到高级应用与避坑指南 Windows GUI编程是桌面应用开发的基础,其核心在于理解消息循环与控件机制。MFC(Microsoft Foundation Classes)作为经典的C++框架,通过封装Win32 API,提供了面向对象的控件编程模型,如CButton、CEdit、CListCtrl等,实现了高效的原生界面开发。其技术价值在于直接基于Windows消息驱动,无需额外运行时依赖,生成的程序体积小、启动快、资源消耗低,特别适合对性能和稳定性要求严苛的场景,如工业控制、金融终端及遗留系统维护。在应用层面,掌握控件的动态创 阅读详情

相关推荐

MFC控件全解析:从标准控件到高级应用与实战技巧

在Windows桌面开发领域,GUI编程是构建用户界面的核心。其底层原理基于消息循环、窗口句柄和资源管理机制,这些概念构成了现代UI框架的基础。理解控件的创建、消息映射与数据交机制,对于开发稳定高效的桌面应用具有要技术价值,尤其在维护遗留系统、工业软件等场景中至关要。本文聚焦MFC控件体系,涵盖标准控件如CButton、CEdit,以及高级公共控件如CListCtrl、CTreeCtrl的使用,并深入探讨了子类化、多线程安全等实战技巧,帮助开发者应对实际开发中的常见问题与性能挑战。

weixin_34062469的博客 479

ClistCtrl、Cedit、CButton

1. 里面有多种自控件,如有XP风格的自按钮。 2. 有各种可以改变颜控件,CEdit、CCombo、CStatic、CLable等。 3. ClistCtrl添加了控件,并且解决了滚动时刷新错误的问题。

MFC控件扩展实战:编辑框、按钮、分组框与下拉框自指南

在Windows桌面开发中,MFC仍是许多工业控制与设备管理软件的要技术栈。面对原生控件在交互与视觉上的不足,开发者常需要借助自与控件扩展来提升界面质量。本文从控件自的基本原理出发,介绍子类化、GDI+辅助制等常见技术路线,并围绕编辑框、按钮、分组框、下拉框等最常用的基础控件,详细讲解水印提示、输入过滤、状态矩阵、圆角制、列表项自等工程实践。同时,文章还梳理了自控件闪烁、画刷生命周期、DPI缩放等常见问题的排查方法,适合需要在MFC工程中快速实现界面定制的开发者参考。掌握这些扩展思路,既能保留

weixin_29189003的博客 331

CEdit控件写类CEditList,输入自动提示匹配内容

CEdit控件写类CEditList,输入自动提示匹配内容,博客链接https://blog.csdn.net/jiangyingfeng/article/details/80454180

MFC控件篇---按钮CEdit

讲解地址:    【编辑框CEdit】控件应用第五课    【编辑框CEdit】控件应用第六课    【编辑框CEdit】控件应用第七课 如果有什么不懂的,或者讲解不到位,出错的,请在http://www.gymsaga.com给我留言,csdn可能不会及时的回复

跟我一起学MFC 4882

VC++界面编程之--自定义CEdit(编辑框)皮肤

自定义编辑框是登陆界面经常用到的效果,所以我也模仿站酷网的素材做了个。 要想继承CCustomDraw来完全自CEdit控件,是不太可行的方案,因为一旦你完全,那么你需要额外做以下几件事: 1. CEdit光标的处理; 2. 当是密码提示时,需要弹窗提示用户大写打开。 3. 需要处理窗口文字的滚动。 这样看来,工作量会很大,而且效果也不一定好。 我这里想到相对比较好的解决方案是:子窗口+透明边框的CEdit。子窗口负责皮肤制,而CEdit负责处理用户的输入。这样一来,可以利用到CEdit原有的

renstarone的博客 6191

CEDIT 控件背景和字体--写CTLCOLOR

先在对话框添加WM_CTLCOLOR消息函数,然后编辑WM_CTLCOLOR消息函数代码,代码如下。 HBRUSH CMessageView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  { HBRUSH hbr = CEditView::OnCtlColor(pDC, pWnd, nCtlColor); // TODO:

vivianliulu的博客 1320

VC界面编程之--自定义CEdit编辑框皮肤:打造个性化编辑框新体验

VC界面编程之--自定义CEdit编辑框皮肤:打造个性化编辑框新体验 去发现同类优质开源项目:https://gitcode.com/ 在软件开发中,界面设计是提升用户体验的关键因素之一。自定义CEdit(编辑框)皮肤,不仅能让应用程序界面更具吸引力,还能彰显开发者的个性化风格。本文将为您详细介绍一个开源项目,该项目提供了一种简单高效的自定义CEdit编辑框皮肤方案。 项目介绍 本项目致力于解决界...

gitblog_06709的博客 289

[置顶] VC++界面编程之--自定义CEdit(编辑框)皮肤

自定义编辑框是登陆界面经常用到的效果,所以我也模仿站酷网的素材做了个。 要想继承CCustomDraw来完全自CEdit控件,是不太可行的方案,因为一旦你完全,那么你需要额外做以下几件事: 1. CEdit光标的处理; 2. 当是密码提示时,需要弹窗提示用户大写打开。 3. 需要处理窗口文字的滚动。 这样一来,工作量会很大,而且效果也不一定好。 我这里想到相对比较好的解...

weixin_34075268的博客 152

MFC CEdit 控件动态修改边框样式

文章目录需求一、文件准备二、使用步骤三、效果 需求 当我的鼠标移动到Edit control上面时,该控件的外框颜改变;当我的鼠标点击该控件时,外框颜又发生变化;当我的鼠标离开该控件时,外框颜又恢复回去。 一、文件准备 通过命令 git clone https://gitee.com/ashuiaaaa/mfc-related-data.git 将相关代码拷贝下来。 二、使用步骤 将项目的CEdit Codes文件夹下的两个文件复制到你的项目文件中; 在你的dialog中include “

A_water_的博客 1731

VC++ CEDIT控件,插入背景图

VC++CEDIT控件,在控件里面插入背景图,可以直接用EVC VS2008打开,

Mfc实现Edit

mfc中实现Edit控件,包括Edit的悬停边框、文字居中,制Edit的非客户区和客户区等。但是有个问题我一直没有解决,就是VS2010中存在.manifest文件时,编辑框上有黑影。

编辑框 文字居中

编辑框 文字居中

VC MFC CEDIT派生类 控件背景 字体修改

VC MFC CEDIT派生类 控件背景 字体修改 并能自动控制显示行数

WTL 界面设计篇(CSkinEdit)

头文件声明(CSkinEdit.h): #pragma once #include "SkinManager.h" // 不支持滚动条皮肤 // 图片背景支持不完整 // Edit控件必须是ES_MULTILINE风格,SetMarginsEx才能生效,ES_MULTILINE风格好像不能动态修改,只能在生成控件时指定 class CSkinEdit : public CWindowImpl<CSkinEdit, CEdit> { public: CSkinEdit(void);

老狼的专栏 1368

mfc常用控件

mfc常用控件

qq_27344469的博客 2566

[原创]为CEdit设置背景图片

以CSkinEdit( public CEdit )为例:效果图:设置Edit的属性:Multiline, 无Border1.定义类成员变量:CBitmap m_bmp;CBrush m_brush;在WM_CREATE消息中初始化它们:int CSkinEdit::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CEdit::OnCreate(lpCr

psbeyond的专栏 6829
上一篇: 关于CT2A和CA2T的作用域
下一篇: 关于GDI+的绘制小结:图片的拉伸、平铺、透明的GDI+实现
BloodFighter
博客等级 码龄22年 47粉丝 7原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值