原始出处: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. 【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上一篇我介绍了JWT的生成验证及流程内容,相信大家也对JWT非常熟悉了,今天将从一个小众的需求出发,介绍如何强制令牌过期的思路和实现过程. ...

  2. Java开发笔记(七十八)面向对象的后门——反射

    作为一门面向对象的编程语言,Java认为一切皆是对象,每个对象都能归属于某个类,甚至每个类均可提取出一种特殊的类型,即Class类型.早在前面介绍多态的时候,就提到每个类都存在独一无二的基因,通过比较 ...

  3. Java_设计模式之享元模式

    1.关于享元模式 享元模式有点类似于单例模式,都是只生成一个对象被共享使用.享元模式主要目的就是让多个对象实现共享,减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的 ...

  4. ES6 Module export与import复合使用

    export与import复合使用 基本语法 export {...} from '文件'; 等价于 import {...} from "文件": export {...} 先加 ...

  5. jsp基础语言-jsp异常

    JSP异常 jsp页面执行时会出现两种异常,实际是javax.servlet.jsp包中的两类异常JsError和JspException. 1.JsError 在jsp文件转换成servlet文件时 ...

  6. 【代码笔记】Web-CSS-CSS Fonts(字体)

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  7. iOS----------viewcontroller中的dealloc方法不调用

    ios的viewcontroller生命周期是 init -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppe ...

  8. iOS-----------设置自定义字体

    1.将字体加入到项目中 2.在info.plist文件中加入相应信息,这一步实际上实在项目的Info页里面增加Fonts provided by application项,并设置相应的ttf文件进去, ...

  9. (办公)plug-in org.eclipse.jdt.ui was unable to load class org.eclipse.jdt.internal

    今天上午开发环境遇到这个问题,解决方案如下,(解决了之后,项目并没有丢失.) 因为Eclipse的这个plug-in org.eclipse.jdt.ui was unable to load cla ...

  10. 【原】Java学习笔记020 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 成员方法的参数列表 ...