开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1336|回复: 26
收起左侧

[易语言纯源码] 【2025开源大赛】【全站首发】使用子类化修改hk条底色

[复制链接]
结帖率:100% (16/16)
发表于 2025-2-5 00:41:38 | 显示全部楼层 |阅读模式   **
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 gytxtx 于 2025-2-5 01:32 编辑

标题:

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

实现原理

1. 子类化技术 (Subclassing)

  • 通过 SetWindowLongA 替换窗口过程,拦截并处理特定消息
  • 主窗口处理 WM_CTLCOLORSTATIC 消息设置背景画刷
  • hk条控件处理 WM_ERASEBKGND 消息自定义背景绘制

2. GDI 对象管理

  • 使用 CreateSolidBrush 创建纯色画刷
  • 通过 FillRect 填充客户区背景
  • 资源释放时调用 DeleteObject 避免内存泄漏

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

.版本 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, 下载次数: 9)

评分

参与人数 3好评 +1 精币 +5 收起 理由
远赴 + 1 + 3 很久没看到这么舒服的排版了
kyo9766 + 1 感谢分享,很给力!~
多多帅吧 + 1 共同努力,共同进步

查看全部评分


本帖被以下淘专辑推荐:

结帖率:75% (3/4)
发表于 2025-2-11 11:54:14 | 显示全部楼层   河南省周口市
感谢你们默默付出
回复 支持 反对

使用道具 举报

结帖率:100% (16/16)

签到天数: 24 天

 楼主| 发表于 2025-2-9 12:33:07 | 显示全部楼层   **
yjrrklove 发表于 2025-2-9 12:03
支持楼主。感觉有点AI的味道?

这个确实,帖子是 AI 写的
回复 支持 反对

使用道具 举报

签到天数: 12 天

发表于 2025-2-9 12:03:16 | 显示全部楼层   山东省东营市
支持楼主。感觉有点AI的味道?
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2025-2-8 14:26:20 | 显示全部楼层   重庆市重庆市
这种贴子得多来点呀。
回复 支持 反对

使用道具 举报

签到天数: 24 天

发表于 2025-2-7 09:37:26 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 4 天

发表于 2025-2-6 23:25:00 | 显示全部楼层   安徽省阜阳市
感谢开源
回复 支持 反对

使用道具 举报

签到天数: 24 天

发表于 2025-2-6 09:36:41 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 25 天

发表于 2025-2-6 08:33:22 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:98% (105/107)

签到天数: 24 天

发表于 2025-2-6 07:14:52 | 显示全部楼层   山东省青岛市
下个学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表