ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 10104|回复: 23

[分享] 简单介绍单元格行列指示的实现原理(俗称聚光灯功能)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2017-12-2 01:28 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:图像处理和GDI
本帖最后由 liucqa 于 2017-12-2 11:27 编辑

单元格行列指示的实现原理(俗称聚光灯功能)

     单元格行列指示功能在录入大表格的时候可以避免行列录入错误,是个非常有用的功能。在某些插件里面俗称聚光灯功能。目前的VBA实现此功能的代码有很多,大概分三类:线段指示、单元格背景、条件格式。这几种方法代码简单,方便易用,效果很好。唯一的缺点是会影响单元格或者表格的一些数据,也会影响Undo和Redo的操作。

    为了避免上面的缺陷,有人采用GDI绘图方式来实现单元格指示功能与工作表格的完全脱离,从根本上避免表格数据信息被破坏。下面我就简单介绍一下此类技术的实现原理。

1、Excel2010及以下版本的实现原理

2、Excel2013以上版本的实现原理

3、Windows7和Windows10实现该功能的重大差别

以上功能在我写的D N A Tools2.51版中已经得到完整验证,具体可以百度下载或者看论坛帖子


下面是此功能在Win10+2016版本中的演示动画
1.gif

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-2 01:28 | 显示全部楼层
本帖最后由 liucqa 于 2017-12-2 13:43 编辑

Excel2010及以下版本的实现原理

单元格行列指示功能,在本论坛有GDI实现的代码,简单原理如下:
1、用spy++可以看到,Excel的表格窗口类名是“Excel7”,父窗口是“XLDESK”,再上面父窗口是“XLMAIN”。
2、通过SelectChange事件,获取激活单元格。
3、通过Windows API获取激活单元格的屏幕坐标和EXCEL7窗口的范围
4、根据上述坐标用GDI直接在EXCEL7窗口上绘图,就可以看到聚光灯效果了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-2 01:29 | 显示全部楼层
本帖最后由 liucqa 于 2018-3-2 07:13 编辑

Excel2013以上版本的实现原理

可是,从Excel2013开始,微软改变了Excel7等窗口的绘图方式,使用DirectX技术绘图,导致GDI无法使用,具体解决办法不详,哪位大神知道留个言。

为了一劳永逸的解决无法绘图的问题,我考虑采用HUD技术。

HUD是Head Up Display的缩写,中文意思是抬头指示。所谓HUD技术就是在正常画面上,叠加一个透明或者半透明效果的窗口,用来显示一些实时的数据。玩过飞行模拟之类游戏的,都会看到这种效果。很多电影的炫酷特效画面也经常能看到。

在Windows下实现HUD技术有很多成熟的例子。最简单的办法就是做一个透明无焦点的窗口即可,例子可以百度或者在开源项目中也能找到很多。

具体流程如下:
1、通过SelectChange事件,获取激活单元格。
2、通过Windows API获取激活单元格的屏幕坐标和EXCEL7窗口的范围
3、挂接自己的透明窗体,根据上述坐标用GDI直接在窗口上绘图,就可以看到聚光灯效果了。
4、注意处理一些窗口消息(例如WM_SIZE等),以确保在Excel窗口发生变化的时候能够实时更新绘图参数。



TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-2 01:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 liucqa 于 2017-12-2 18:33 编辑

Windows7和Windows10实现该功能的重大差别

1、Windows7操作系统的API和Windows8以上操作系统有些区别。特别是对透明窗体的一些关键API处理存在Bug,我不清楚是什么原因造成的,如果有哪位大神知道,在此留个言。

2、Excel在Windows7和Windows10下的消息也有很大不同,有些消息直接影响了代码流程,如果你想做这个功能的开发,切记一定要准备两个操作系统环境

3、监听XLMAIN和EXCEL7窗口基本可以满足功能需求,但要注意在不同系统下的消息差异,这很坑爹!

DNATools v2.x版的代码统计
QQ图片20171202183243.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-2 01:30 | 显示全部楼层
本帖最后由 liucqa 于 2017-12-2 19:50 编辑

单元格行列指示目前实现的一些功能简介:

1、可自定义颜色的单元格焦点指示功能

2、用于行列对齐识别(采用GDI32实现,不影响工作表数据)
3、支持切换工作簿工作表\冻结窗格\滚动条\鼠标滚轮\拖拽单元格等各种情况
4、支持Excel2013、2016。彻底解决闪烁问题。

下载


总结:HUD技术的用途很广,学会了这个技术的应用,相信你对Winform编程会上升到一个新的台阶!


如果有谁对本人写的单元格行列指示功能源代码有兴趣的,可以QQ找我联系!




TA的精华主题

TA的得分主题

发表于 2017-12-2 08:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Mark一下,搬个小板凳看如何实现

TA的精华主题

TA的得分主题

发表于 2018-2-2 10:37 | 显示全部楼层
难度不小,慢慢学习。谢谢liucqa!

TA的精华主题

TA的得分主题

发表于 2018-2-2 15:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-2-4 13:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-2-28 13:55 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 04:04 , Processed in 0.035377 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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