求助2个高级表格滚动条同步问题
功能说明:本程序是基于易语言(EPL)开发的一个技术演示或实用工具,主要功能是实现两个 eGrid 高级表格控件之间的滚动条同步联动。当用户滚动第一个表格时,第二个表格会自动跟随移动相同的距离,保持数据行的水平对齐。这对于需要对比查看大量列表数据的场景非常有用。
程序的核心逻辑依赖于对 Windows 窗口消息的处理以及 Win32 API 的调用。具体实现细节如下:
1. 初始化与数据填充:
在 `__启动窗口_创建完毕` 子程序中,程序首先获取了 `高级表格 1` 的原始窗口过程指针并保存为 `默认窗口 1`。随后使用 `SetWindowLongA` 函数替换了 `高级表格 1` 的消息处理函数,指向自定义的子程序 `处理`。接着,程序通过循环向两个表格中填充了测试数据,以便观察滚动效果。
2. 消息钩子与拦截:
核心子程序 `处理` 充当了自定义的窗口过程(WndProc)。它接收窗口句柄、消息代码及参数。程序重点监控消息代码为 277 的事件,这通常对应于垂直或水平滚动条的操作消息(WM_VSCROLL/WM_HSCROLL)。当检测到该消息时,说明 `高级表格 1` 发生了滚动操作。
3. 同步机制实现:
代码中展示了两种略有不同的同步策略,可能代表了不同版本或优化思路:
- 直接发送消息法:在捕获到滚动消息后,直接解析滚动位置参数,并通过 `SetScrollPos` 或直接发送消息给 `高级表格 2`,强制其滚动到相同位置。这种方法响应速度快,但可能在复杂滚动状态下精度不够。
- 定时器精确同步法:在代码后半部分引入了 `timeSetEvent` 和 `timeKillEvent`,创建了 `全局_鼠标时钟`。当触发滚动事件时,并不立即强制同步,而是启动一个高频定时器(30 毫秒),调用 `延时器` 子程序。在 `延时器` 中,利用 `GetScrollInfo` 准确获取 `高级表格 1` 当前的滚动范围、位置和跟踪位信息,然后通过 `SetScrollInfo` 将这些属性完整应用到 `高级表格 2` 上。这种方式能更好地处理最小值、最大值等属性的同步,确保滚动状态完全一致。
4. 资源清理:
在 `__启动窗口_可否被关闭` 事件中,程序还原了 `高级表格 1` 的原始窗口过程指针(恢复为 `默认窗口`),这是一种良好的编程习惯,防止程序异常退出后遗留消息钩子导致内存泄漏或界面异常。
综上所述,该程序是一个典型的 Windows GUI 底层操作案例,展示了如何绕过控件的高层封装,直接通过底层 API 干预控件行为,从而实现标准的控件所不具备的“联动”功能。涉及的 DLL 命令包括 user32 库中的滚动条控制函数和 winmm.dll 中的多媒体定时器函数。
======启动窗口程序集
| |
| |------ __启动窗口_创建完毕
| |
| |------ 处理
| |
| |------ __启动窗口_可否被关闭
| |
| |
======调用的Dll
| |
| |---[dll]------ CallWindowProcA
| |
| |---[dll]------ SetWindowLongA
| |
| |---[dll]------ SetScrollPos
| |
| |---[dll]------ GetScrollPos
======启动窗口程序集
| |
| |------ __启动窗口_创建完毕
| |
| |------ 处理
| |
| |------ 延时器
| |
| |------ __启动窗口_可否被关闭
| |
| |
======调用的Dll
| |
| |---[dll]------ CallWindowProcA
| |
| |---[dll]------ SetWindowLongA
| |
| |---[dll]------ SetScrollPos
| |
| |---[dll]------ GetScrollPos
| |
| |---[dll]------ GetScrollInfo
| |
| |---[dll]------ SetScrollInfo
| |
| |---[dll]------ timeKillEvent
| |
| |---[dll]------ timeSetEvent
注:本站源码主要来源于网络收集。如有侵犯您的利益,请联系我们,我们将及时删除!
部分源码可能含有危险代码,(如关机、格式化磁盘等),请看清代码在运行。
由此产生的一切后果本站均不负责。源码仅用于学习使用,如需运用到商业场景请咨询原作者。
使用本站源码开发的产品均与本站无任何关系,请大家遵守国家相关法律。