Excel阅读模式/聚光灯开发技术之二 超级逐步录入提示功能开发原理简述—— 隐鹤 / HelloWorld

Excel阅读模式/聚光灯开发技术之二

超级逐步录入提示功能开发原理简述———— 隐鹤  /  HelloWorld

1. 引言

自从发了博文“Excel阅读模式/单元格行列指示/聚光灯开发技术要点再分享”后,因为有网友,编历测试Kutools,uuoffice,DnaTools,方方格子,易用宝等各大插件的聚光灯,都发现没我原来发的测试版好使),于是不少网友,私聊问我要开发的阅读模式/聚光灯插件(ExcelPower_Helper)。然而,久而未发,主要原因有三:

1.尽管我开发的聚光灯,据网友反应是目前最好使的。但我自己知道,截止到发那篇博文为止,我的还不能算是够好,只能与DnaTools,Kutools的相应功能同属一个水平。因为有一个位置计算的Bug始终没有解决,这个Bug导致在缩放的时候某些位置会有1-4个像素的误差。而这个bug是所有上面提到的大名鼎鼎的插件都具有的问题。虽然不影响使用(除了有完美主义的强迫症外),但bug就是bug。

2. 聚光灯技术自去年四月查资料研究,直至七八月完成。着实花了不少精力。但确实是打开winform深度技术的一扇门。完成下来,可以得到不少提升。想着继续学习。也是受启发于Kutools和平时的一些想法,决定开发基于此技术的三部作品后,即超级任务窗格,超级录入提示。,再发出给大家使用。

3.就是本人各种忙碌。三年前空闲时间多,现在愈发的时间少。

截止本文发出之际,可以很愉快的告诉各位网友,第一个原因和第二点原因都已解决。最重要的是,可以真正吹个牛逼了(^_^),那个聚光灯阅读模式的bug已经解决了,ExcelPower_Helper的聚光灯堪称神灯了(^_^),媲美WPS原生功能,完美击败所有office聚光灯/阅读模式,包括Kutools的阅读模式。见图:

牛逼不多吹,进入正题。

各位试想下,如果能在Excel单元格中的输入内容的同时,提供与当前输入关联的提示列表,类似百度、Google的搜索框,将是个非常酷,有意思的功能,也是非常实用的,比如在生产企业做跟单的时候,往往要根据客户报来的购买产品的信息查看录入相应的产品型号等信息,如有此功能,我们添加自己的产品信息作为数据源,随着输入出现提示信息列表,将会很方便。

所谓Excel单元格逐步录入提示, 其本质就是:要结合单元格这种特殊文本框的一个Keypress事件,随着键入内容的变化做一些事情。可惜,微软并没有为Excel单元格提供这个编程接口。

这样一个功能在实际中是非常有用的,最明显的是如果在以Excel为基础界面的进销存系统中,如果有这个功能将会十分方便。如下图,便可看出。

 

由于微软并没有为Excel单元格提供类似KeyPress事件的编程接口,要实现这个功能起来还是有一定难度的。

2. 一起来看看目前各路大神实现方式:

2.1 内置表单控件方式

本人较早看到这种实现是在eh论坛,印像是“百度不到去谷歌“网友这的一篇帖子。之后看到国外论坛已有类似思路。概括来说,其思路主要是在Excel里插入一个表单控件Texbox,和一个Listbox,通过Texbox的Textchange事件,动态的呈现与输入相关的数据在列表框Listbox中,并在选择单元格事件里动态的移动Textbox的位置,使其覆盖单元格的位置,造成一种在单元格里输入的假象。这里面,有个巧妙的地方就是利用了List box的visible属性,以实时更新列表关联数据。如图所示。

优点:这个效果还是不错的。优点也很多,比如列表框,可以支持多列内容,而且可以表格化对齐(这个好像很少人会用,大多数是用特殊符合如▲等,将多列内容连接,然后再拆分到表格的不同列,这样的问题是Listbox里的各列会因为字符原因对不齐,外观视觉效果也不好。其实大可不必这样,是有方法的可以做到列表里的各列实行表格化对齐的。),这种开发方式也很方便。

不足:要严格的说,不足的地方就是用户体验不够好。有网友就和我反应,当调整下列宽之类的,或者其他的正常操作会导致textbox和listbox突然显示在表中,很突兀,有时候不小心还会被用户无意删除,而如果开发者,不处理这种情况,代码将直接无法继续运行。而且覆盖在单元格上,用户要对单元格进行选中进行一些格式调整等等,也十分不方便。实在不够友好。

2.2 外载winform窗体方式

或许是上述表单控件的开发方式的不足,有人用直接挂载一个包含textbox和listbox控件的winform窗体。直接在窗体上操作,脱离表格。通过窗体控件的textbox的keypress或者Textchange事件以及输入完成击键控制活动单元格的位置,如下图。这样虽然不会有表单控件被误删除等等的不足。

2.3 基于单元格的输入消息捕获方式(体验最好)

 总体上来说,目前就我所见和了解就是以上两种方式,目前为止还没有人开发出直接在单元格里输入逐步提示这样一种方式的,这种需求倒是有网友提过。

于是,有人就问了。难道就不能让Excel单元格相应键入事件吗,做到类似百度搜索框那样,随输入内容实时呈现出内容吗?这个问题也是我一直在探寻的,答案是肯定的,就是今天要给大家推送的本人的插件ExcelPowerHelper中的第二大功能两点:超级录入提示。功能界面下图:

 

 

此部分最后,来谈下本人作品ExcelPower Helper中的录入提示,目前支持Google拼音输入法,搜狗输入法,百度输入法,QQ输入法,以及微软输入法,后续将继续改进,让其支持更多的输入法,增加快捷键等。客观来说,能实现到现在的功能,已经可以让目前的那些逐步录入提示相形见绌了,又要树立标杆了。(牛皮又吹起来了^_^)

ExcelPower Helper中的录入提示  支持模糊匹配,支持拼音首字母检索,支持被检索词以加粗的方式突出显示与列表框中。支持中英文混合输入。

 

3.开发技术要点简述

   

 后来居上,本文最重要的部分,来谈一谈实现这种方式的简要原理:

1.用一些工具我们可以看到,Excel中的活动单元格实际是一个不断调整显示位置的窗体,其类名为“EXCEL6”,其句柄在Excel的工作簿工作期间总是固定的。

2.从Windows消息角度看,一切事件都是基于Windows消息的包装。于是我们可以通过工具查看当用户在单元各种输入内容时候,发生了什么消息,尤其要关注Excel6窗口的消息。可以通过Hook或者微软提供的基类来对消息进行捕获拦截。当识别到输入完成的消息时,做我们的处理,把关联内容写入到无焦点的装载Listbox控件的窗体中,并根据活动单元格的位置将其显示给用户。

3,比较难处理的地方是,你要去区分输入的字符类型和输入法的状态,比如英文,数字,中文,不同的输入法消息类型和对消息的处理及其返回值也不一样。

4.Win7和win10下的处理的消息方式还不太一样。

5.如果还要比较好呈现关联数据出来,还要考虑匹配的速度和呈现的方式问题,如检索字在目标条目中突出显示,加粗等,代码量就大了。

6.其他如还要要考虑用户的操作,可能会长按某个键盘,等等可能需要用到KEYBOARD Hook。

感兴趣的可以按以上六点思路,去研究下。

【总结】

         其实这玩意,远比聚光灯/行列指示/阅读模式的开发要复杂,聚光灯,也是捕获消息,但是要考虑的东西比较单一。录入提示涉及到输入法的这一部分就够考验人的。各大输入法都有自己方式。要摸清他们的消息的递送逻辑也是很费事的。

        接下来会发一篇关于高级任务窗格的文章,简述原理。高级任务窗格这个词早已有之,国外有专门卖这个的。所以是有根据的,高不高级另说,先告诉大家怎么实现才是最重要的。

        祝各位看官,安好。

 

 

猜你喜欢

转载自www.cnblogs.com/yinhe-Helloworld/p/10564329.html