原始出处:www.cnblogs.com/Charltsing/p/CellLight.html

QQ:564955427

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

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

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

Excel2010及以下版本的实现原理

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

Excel2013以上版本的实现原理

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

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

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

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

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

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

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

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

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

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

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

以上功能在我写的DNA Tools2.x版中已经得到完整验证。

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

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

简单介绍Excel单元格行列指示的实现原理(俗称聚光灯功能)的更多相关文章

  1. Excel阅读模式/单元格行列指示/聚光灯开发 技术要点再分享

    1. 引言 文题中所谓技术要点再分享,本意是想在大神Charltsing Liu的博文“简单介绍Excel单元格行列指示的实现原理(俗称聚光灯功能)”的基础上写一点个人开发体会.写本文的初衷有三点,一 ...

  2. iOS开发UI篇—简单介绍静态单元格的使用

    iOS开发UI篇—简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...

  3. Excel 单元格自定义格式技巧总结

    第一部分 Excel 中的单元格格式是一个最基本但是又很高级的技能,说它基本是因为我们几乎天天都会用到它,会用它来设置一些简单的格式,比如日期,文本等等:高级是因为利用 Excel 单元格的自定义格式 ...

  4. C# ASP.NET 读取EXCEL 单元格 读取 空值 不显示

    跟大家分享一下,[摘自]:http://blog.csdn.net/li185416672/article/details/8213729 读取excel时,某些单元格为空值 原来如此: 当我们用ol ...

  5. excel 单元格0 不显示的最佳方法

    excel单元格设自定义格式, 条件:可以单元格内容判断后再设置格式.条件格式化只限于使用三个条件,其中两个条件是明确的,另个是“所有的其他”.条件要放到方括号中.必须进行简单的比较.例如这个条件:单 ...

  6. POI实现EXCEL单元格合并及边框样式

    POI实现EXCEL单元格合并及边框样式     下面例子为创建产生一个excel,合并单元格,然后为合并后的单元格添加边框 package test; import java.io.FileOutp ...

  7. excel单元格内容拆分

    这几天在整理数据,但是数据都在表格的一个单元格中,看起来很不方法,所以在网上找到excel单元格内如拆分的方法,并亲测有效 介绍2种拆分的方法 方法一: (1)在B1输入公式=right(text,[ ...

  8. EXCEL单元格的获取——多例模式

    因为Excel的单元格的行列与单元格是一一相应的,行与列组成的是一对联合主键.给定一个单元格行列或者给定一个单元格名称.须要找到相应的单元格:这样就形成了一种映射关系.须要使用单例模式的变式--多例模 ...

  9. 转:Java修改Excel单元格的数据及格式

    https://blog.csdn.net/aking21alinjuju/article/details/6001153?locationNum=2 继前两节的Java读取.写入Excel后,本期将 ...

随机推荐

  1. Using rqt_console and roslaunch

    Description: This tutorial introduces ROS using rqt_console and rqt_logger_level for debugging and r ...

  2. 使用asp.net mvc + entityframework + sqlServer 搭建一个简单的code first项目

    步骤: 1. 创建一个asp.net mvc 项目 1.1 项目创建好结构如下 2 通过vs安装EntityFramework框架 install-package entityframework 3. ...

  3. 【Nginx】使用nginx反向代理IIS实现80端口的解放

    下载版本: 官网地址:http://nginx.org/en/download.html 我使用了稳定版本. 下载完成之后进行目录解压,解压之后大概就是这个样子: 网上很多人写这些了想了解概念的百度一 ...

  4. 【Linux】Linux上安装Nginx

    本文介绍Linux环境安装Nginx,这里用的Linux系统是CentOS 7.2. 1. 从Nginx官网下载Nginx.这里用的版本为:1.13.6. 2. 将下载下来的Nginx上传到Linux ...

  5. Linux CentOS设置定时重启:crontab

    上一篇介绍了 开机自启动chkconfig命令  https://www.cnblogs.com/prefectjava/p/9399470.html 本篇介绍 crontab 设置定时任务,并且把 ...

  6. Python 100例(001)

    #!/usr/bin/env python # coding:utf-8 '''有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少?''' n = 1 num = [4, ...

  7. 我从来不理解JavaScript闭包,直到有人这样向我解释它...

    摘要: 理解JS闭包. 原文:我从来不理解JavaScript闭包,直到有人这样向我解释它... 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正如标题所述,JavaScript闭包 ...

  8. getDimension与getDimensionPixelOffset与getDimensionPixelSize的区别

    getDimension()                       返回float型px值     精确  getDimensionPixelOffset()     返回int型px值     ...

  9. Android如何实现超级棒的沉浸式体验

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由brzhang发表于云+社区专栏 做APP开发的过程中,有很多时候,我们需要实现类似于下面这种沉浸式的体验. 沉浸式体验 一开始接触的 ...

  10. js调用浏览器打印指定div内容

    --打印按钮事件 function printForm(){    var headstr = '<html xmlns:th="http://www.thymeleaf.org&qu ...