精易论坛

标题: 【2025开源大赛】【全站首发】使用子类化修改hk条底色 [打印本页]

作者: gytxtx    时间: 2025-2-5 00:41
标题: 【2025开源大赛】【全站首发】使用子类化修改hk条底色
本帖最后由 gytxtx 于 2025-2-5 01:32 编辑

标题:


[2025开源大赛] [全站首发] 使用子类化技术修改hk条背景颜色



实现原理


1. 子类化技术 (Subclassing)



2. GDI 对象管理





部分源码(完整源码见附件)


.版本 2
.支持库 user32
.支持库 kernel

.程序集 窗口程序集_启动窗口
.程序集变量 OldMainProc, 整数型
.程序集变量 OldTrackBarProc, 整数型
.程序集变量 hTrackBarBrush, 整数型
.程序集变量 hk条背景颜色, 整数型

.数据类型 RECT
    .成员 left, 整数型
    .成员 top, 整数型
    .成员 right, 整数型
    .成员 bottom, 整数型

.DLL命令 GetClientRect, 整数型, "user32.dll", "GetClientRect"
    .参数 hWnd, 整数型
    .参数 lpRect, RECT

.DLL命令 FillRect, 整数型, "user32.dll", "FillRect"
    .参数 hDC, 整数型
    .参数 lprc, RECT
    .参数 hBrush, 整数型

.子程序 __启动窗口_创建完毕
hk条背景颜色 = #青蓝
hTrackBarBrush = CreateSolidBrush(hk条背景颜色)

.如果真 (hTrackBarBrush = 0)
    信息框("画刷创建失败!", 0, , )
    结束()
.如果真结束

OldMainProc = SetWindowLongA(取窗口句柄(), #GWL_WNDPROC, 到数值(&NewProc_Main))
OldTrackBarProc = SetWindowLongA(hk条1.取窗口句柄(), #GWL_WNDPROC, 到数值(&NewProc_TrackBar))

.子程序 __启动窗口_将被销毁
.如果真 (是否已创建(hk条1))
    SetWindowLongA(hk条1.取窗口句柄(), #GWL_WNDPROC, OldTrackBarProc)
.如果真结束
SetWindowLongA(取窗口句柄(), #GWL_WNDPROC, OldMainProc)

.如果真 (hTrackBarBrush ≠ 0)
    DeleteObject(hTrackBarBrush)
    hTrackBarBrush = 0
.如果真结束

.子程序 NewProc_Main, 整数型
.参数 hWnd, 整数型
.参数 Msg, 整数型
.参数 wParam, 整数型
.参数 lParam, 整数型

.判断开始 (Msg = #WM_CTLCOLORSTATIC 且 lParam = hk条1.取窗口句柄())
    SetBkMode(wParam, #TRANSPARENT)
    返回 (hTrackBarBrush)
.默认
    返回 (CallWindowProcA(OldMainProc, hWnd, Msg, wParam, lParam))
.判断结束

.子程序 NewProc_TrackBar, 整数型
.参数 hWnd, 整数型
.参数 Msg, 整数型
.参数 wParam, 整数型
.参数 lParam, 整数型
.局部变量 rect, RECT

.判断开始 (Msg = #WM_ERASEBKGND)
    GetClientRect(hWnd, rect)
    FillRect(wParam, rect, hTrackBarBrush)
    返回 (1)
.判断 (Msg = #WM_DESTROY)
    返回 (CallWindowProcA(OldTrackBarProc, hWnd, Msg, wParam, lParam))
.默认
    返回 (CallWindowProcA(OldTrackBarProc, hWnd, Msg, wParam, lParam))
.判断结束



关键代码解析


1. 初始化部分


.子程序 __启动窗口_创建完毕
hTrackBarBrush = CreateSolidBrush(#青蓝)  ’ 创建背景画刷
SetWindowLongA(hk条1.取窗口句柄(), #GWL_WNDPROC, 到数值(&NewProc_TrackBar))  ’ 子类化hk条

2. 消息处理


’ 主窗口处理静态控件颜色
.判断开始 (Msg = #WM_CTLCOLORSTATIC)
    返回 (hTrackBarBrush)  ’ 返回自定义画刷

’ hk条处理背景擦除
.判断开始 (Msg = #WM_ERASEBKGND)
    FillRect(wParam, rect, hTrackBarBrush)  ’ 填充背景

3. 资源释放


.子程序 __启动窗口_将被销毁
DeleteObject(hTrackBarBrush)  ’ 必须释放GDI对象
SetWindowLongA(..., OldTrackBarProc)  ’ 恢复原始窗口过程



注意事项



  1. GDI 对象管理

    • 必须成对调用 CreateSolidBrush / DeleteObject

    • 建议添加错误检查:hTrackBarBrush ≠ 0


  2. 子类化安全

    • 窗口销毁前必须恢复原始过程

    • 使用 是否已创建 () 判断控件有效性


  3. 消息处理规范

    • 未处理的消息必须传递原始过程

    • WM_ERASEBKGND 返回 1 表示已处理





下载附件


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


修改hk条底色_Fix.e (30.99 KB, 下载次数: 10)


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


https://wwcw.lanzoue.com/i2QgB2mqcr9e
密码:bba0



使用


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




技术交流


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



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


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


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





@xizhihan


作者: 小白马哒哒    时间: 2025-2-5 01:01
谢谢分享
作者: cqcc    时间: 2025-2-5 07:11
感谢分享!
作者: 豆豆灰常开心    时间: 2025-2-5 07:13
感谢发布原创作品,精易因你更精彩!6666666666666
作者: 查过    时间: 2025-2-5 07:17
感谢分享,很给力!~
作者: 杨明煜    时间: 2025-2-5 07:46
真值得学习,感谢!......
作者: muye84    时间: 2025-2-5 07:54

感谢分享,很给力!~
作者: pshq123    时间: 2025-2-5 08:08
已经顶贴,感谢您对论坛的支持!
作者: 李泽勇2    时间: 2025-2-5 08:30
看起来挺复杂。
作者: dot    时间: 2025-2-5 08:51
支持开源。。。。
作者: kyo9766    时间: 2025-2-5 09:00
看一下怎么修改,感谢分享
作者: hezeyu    时间: 2025-2-5 09:46
感谢分享!
作者: wjswzj0    时间: 2025-2-5 10:24
感谢分享,很给力!~
作者: airaz    时间: 2025-2-5 12:40
窗口销毁前必须恢复原始过程,其实我写程序经常不关闭,结果就是程序窗口关了,后台还在跑
作者: xjshuaishuai    时间: 2025-2-5 15:35
谢谢分享!
作者: 1184798949    时间: 2025-2-5 15:51
感谢分享
作者: 远赴    时间: 2025-2-6 03:14
很久没看到这么舒服的排版了
作者: 豆豆灰常开心    时间: 2025-2-6 07:10
感谢楼主分享!
作者: 查过    时间: 2025-2-6 07:14
下个学习一下
作者: year1970    时间: 2025-2-6 08:33
感谢分享
作者: please    时间: 2025-2-6 09:36
感谢分享,支持开源!!!
作者: 鬼客    时间: 2025-2-6 23:25
感谢开源
作者: please    时间: 2025-2-7 09:37
感谢分享,支持开源!!!
作者: 8554036    时间: 2025-2-8 14:26
这种贴子得多来点呀。
作者: yjrrklove    时间: 2025-2-9 12:03
支持楼主。感觉有点AI的味道?
作者: gytxtx    时间: 2025-2-9 12:33
yjrrklove 发表于 2025-2-9 12:03
支持楼主。感觉有点AI的味道?

这个确实,帖子是 AI 写的
作者: 木子心    时间: 2025-2-11 11:54
感谢你们默默付出




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