精易论坛

标题: 【2025开源大赛】【全站首发】使用子类化修改按钮边框颜色 [打印本页]

作者: gytxtx    时间: 2025-2-4 21:48
标题: 【2025开源大赛】【全站首发】使用子类化修改按钮边框颜色
本帖最后由 gytxtx 于 2025-2-5 14:44 编辑

标题:


【易语言子类化实战】自定义按钮边框颜色 | 纯源码 + WM_CTLCOLORBTN 消息处理



其实具体来说应该是修改底色吧,毕竟我的需求是修改 Windows 10 按钮的 1px 的边框,这个默认边框在窗口底色不是默认底色的时候就很烦人(会出现色差)


源码简介


通过窗口子类化(Subclassing)技术,拦截 WM_CTLCOLORBTN 消息,实现按钮边框颜色的自定义绘制。代码简洁高效,适用于 易语言 5.x 版本,无第三方依赖。




实现原理



  1. 子类化(Subclassing)

    • 核心思想:替换窗口的默认消息处理过程(WndProc),插入自定义逻辑。

    • 关键 API:

      SetWindowLongA 修改窗口过程 → CallWindowProcA 调用原有逻辑。


  2. 颜色控制

    • WM_CTLCOLORBTN 消息:当按钮需要绘制时触发,返回画刷句柄决定背景色。

    • 颜色设置:

      CreateSolidBrush 创建画刷 → SetTextColor / SetBkColor 设置文本和背景色。





源码展示


核心代码(完整源码见附件)


.版本 2
.程序集 窗口程序集_启动窗口
.程序集变量 OldBtnProc, 整数型  ' 保存按钮原始窗口过程
.程序集变量 hBtnBrush, 整数型   ' 按钮背景画刷

.子程序 __启动窗口_创建完毕
    hBtnBrush = CreateSolidBrush (#绿色)  ' 创建绿色画刷
    ' 子类化按钮
    OldBtnProc = SetWindowLongA (按钮1.取窗口句柄 (), #GWL_WNDPROC, 到数值 (&BtnProc))

.子程序 BtnProc, 整数型
.参数 hWnd, 整数型
.参数 uMsg, 整数型
.参数 wParam, 整数型
.参数 lParam, 整数型
.判断开始 (uMsg = #WM_CTLCOLORBTN)
    SetTextColor (wParam, #白色)    ' 设置文字白色
    SetBkColor (wParam, #绿色)      ' 设置背景绿色
    返回 (hBtnBrush)               ' 返回画刷
.判断 (uMsg = #WM_DESTROY)
    ' 恢复原始窗口过程,防止内存泄漏
    SetWindowLongA (hWnd, #GWL_WNDPROC, OldBtnProc)
    返回 (0)
.默认
    ' 其他消息交还系统处理
    返回 (CallWindowProcA (OldBtnProc, hWnd, uMsg, wParam, lParam))
.判断结束

.子程序 __启动窗口_将被销毁
    DeleteObject (hBtnBrush)  ' 释放画刷



使用说明



  1. 直接调用:

    将代码粘贴到易语言窗口程序集中,修改 #绿色 为其他颜色值即可。

  2. 扩展应用:

    • 修改 WM_PAINT 实现更复杂绘制

    • 动态切换颜色:在事件中调用 DeleteObject + 重新创建画刷





注意事项



  1. 资源释放:

    • 必须调用 DeleteObject 释放画刷,否则会 GDI 泄漏!

    • 窗口销毁时恢复原始 WndProc(见 WM_DESTROY 处理)。


  2. 线程安全:

    • 子类化仅限当前线程窗口,跨线程操作会崩溃。


  3. 动态控件:

    • 循环创建按钮时,需为每个控件单独保存 OldProc。





常见问题


Q1:如何修改边框粗细?

A:需处理 WM_NCPAINT 消息,或改用自绘组件。


Q2:Win10 / Win11 下颜色不生效?

A:部分系统版本需额外处理 WM_THEMECHANGED




下载附件


请在下方的附件中下载源代码:


修改按钮边框颜色.e (7.25 KB, 下载次数: 11)


修改按钮边框颜色_Fix.e (29.48 KB, 下载次数: 27)


建议使用 修改按钮边框颜色_Fix.e,因为修复了内存泄漏问题。


亦或,在蓝奏云中下载源代码:


https://wwcw.lanzoue.com/b00b4dj2yf
密码:3f4l

使用


本源码各位可随意转载、使用。




技术交流


如有疑问或优化建议,欢迎回帖讨论!



本帖为【2025开源大赛】参赛作品,期待您的支持!


帖子链接:https://125.confly.eu.org/thread-14847381-1-1.html


本帖子内容的原理介绍来源于 DeepSeek R1。





@xizhihan


作者: zwqcat    时间: 2025-2-4 21:49
看看看看怎么样
作者: FanLi    时间: 2025-2-4 22:09
这个,挺好的。
作者: chenyucheng    时间: 2025-2-4 23:41
Windows XP 的运行效果:

未命名.PNG (22.62 KB, 下载次数: 137)

未命名.PNG

作者: 小白马哒哒    时间: 2025-2-5 01:03
谢谢分享
作者: wh1234567    时间: 2025-2-5 02:43
谢谢分享
作者: wh1234567    时间: 2025-2-5 02:45
按钮能不能整体改变颜色以及按钮字体颜色?彩色边框搭配**内芯有点不美观,呵呵呵
作者: 豆豆灰常开心    时间: 2025-2-5 07:13
感谢您对论坛的支持!
作者: 查过    时间: 2025-2-5 07:18
感谢分享,很给力!~
作者: 李泽勇2    时间: 2025-2-5 08:32
楼主威武!
作者: kyo9766    时间: 2025-2-5 09:02
网盘好评,感谢分享
作者: 胖子葛格    时间: 2025-2-5 09:48
感谢大神分享~!
作者: gytxtx    时间: 2025-2-5 14:39
wh1234567 发表于 2025-2-5 02:45
按钮能不能整体改变颜色以及按钮字体颜色?彩色边框搭配**内芯有点不美观,呵呵呵 ...

这个我试着做一下吧
作者: ctry78985    时间: 2025-2-5 14:42
感谢分享
作者: xjshuaishuai    时间: 2025-2-5 15:35
谢谢分享!
作者: 1184798949    时间: 2025-2-5 15:55
感谢分享
作者: cqcc    时间: 2025-2-5 16:32
非常不错!
作者: 亿万    时间: 2025-2-5 20:17
开源精神必须支持~
作者: 豆豆灰常开心    时间: 2025-2-6 07:10
下个学习一下
作者: 查过    时间: 2025-2-6 07:15
下个学习一下
作者: year1970    时间: 2025-2-6 08:33
感谢分享
作者: 一覓一光年    时间: 2025-2-6 09:41
开源精神必须支持~
作者: 8554036    时间: 2025-2-8 14:38
必须点赞呀~
作者: a3960382663    时间: 2025-2-18 13:54
        感谢分享,很给力!~
作者: 淡忘一季    时间: 2025-5-5 23:55
请教,有没有办法改变  按钮 标题 的字体 颜色?




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4