标题:
【易语言子类化实战】自定义按钮边框颜色 | 纯源码 +
WM_CTLCOLORBTN
消息处理
其实具体来说应该是修改底色吧,毕竟我的需求是修改 Windows 10 按钮的 1px 的边框,这个默认边框在窗口底色不是默认底色的时候就很烦人(会出现色差)
通过窗口子类化(Subclassing)技术,拦截 WM_CTLCOLORBTN
消息,实现按钮边框颜色的自定义绘制。代码简洁高效,适用于 易语言 5.x 版本,无第三方依赖。
WndProc
),插入自定义逻辑。SetWindowLongA
修改窗口过程 → CallWindowProcA
调用原有逻辑。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) ' 释放画刷
#绿色
为其他颜色值即可。WM_PAINT
实现更复杂绘制DeleteObject
+ 重新创建画刷DeleteObject
释放画刷,否则会 GDI 泄漏!WndProc
(见 WM_DESTROY
处理)。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。
未命名.PNG (22.62 KB, 下载次数: 137)
wh1234567 发表于 2025-2-5 02:45
按钮能不能整体改变颜色以及按钮字体颜色?彩色边框搭配**内芯有点不美观,呵呵呵 ...
欢迎光临 精易论坛 (https://125.confly.eu.org/) | Powered by Discuz! X3.4 |