Excel閱讀模式/聚光燈開發技術之二 超級逐步錄入提示功能開發原理簡述—— 隱鶴 / HelloWorld


Excel閱讀模式/聚光燈開發技術之二

超級逐步錄入提示功能開發原理簡述———— 隱鶴  /  HelloWorld

1. 引言

自本人第一篇博文“Excel閱讀模式/單元格行列指示/聚光燈開發技術要點再分享”闡述ExcelPower_Helper中的聚光燈/閱讀模式功能后,網友們遍歷測試Kutools,uuoffice,DnaTools,方方格子,易用寶等等各大知名插件的聚光燈,發現都沒我最早發出的測試版好使,不少網友,私聊我要本人開發的插件ExcelPower_Helper。然而,久而未發,主要原因有三:

1.位置算法不精准的Bug未解決。早期發出的測試版,有一個位置計算不夠精准的Bug,導致在縮放的時候某些位置會有1-4個像素的誤差。請注意,這是所有基於HUD技術開發的聚光燈/閱讀模式的通有的BUG, 包括:Kutools(收費),DNAtools,UUoffice,方方格子,以及EH論壇網友的導航燈。

2. HUD技術三大神器未完成。聚光燈用到的HUD技術是打開winform深度技術的一扇門。本人決定開發基於此技術的三部作品(即聚光燈(閱讀模式),超級任務窗格,超級錄入提示)后,再出來驚天地,泣鬼神,^_^

3. 俗務纏身,各種忙碌。

截止本文發出之際,可以很愉快的告訴各位網友,是時候真正吹個牛逼了(^_^),基於HUD技術開發的聚光燈/閱讀模式的通有的BUG已得到完美解決,誤差修正到1個像素內,ExcelPower_Helper的聚光燈/閱讀模式將是Number One,各路插件被斬殺麾下,仰天大笑出轅營,媲美WPS原生功能。

 

牛逼不多吹,進入正題。

各位試想下,如果能在Excel單元格中的輸入內容的同時,提供與當前輸入關聯的提示列表,類似百度、Google的搜索框,將是個非常酷,有意思的功能。比如在生產企業做跟單的時候,往往要根據客戶報來的購買產品的信息查看錄入相應的產品型號等信息,如我們能添加自己的產品信息作為數據源,隨着輸入出現提示信息列表,將會十分受用。

Excel單元格逐步輸入提示功能的簡要定義:所謂Excel單元格逐步錄入提示, 其本質就是要結合單元格這種特殊文本框的一個Keypress事件,隨着鍵入內容的變化做一些事情。可惜,微軟並沒有為Excel單元格提供這個編程接口。

由於微軟並沒有為Excel單元格提供類似KeyPress事件的編程接口,如果要從KeyPress方向着手,將是十分困難的一件事。

2. 目前各路大神實現方式:

2.1 內置表單控件方式

本人較早看到這種實現是在eh論壇,印像是“百度不到去谷歌“網友這的一篇帖子。之后看到國外論壇已有類似思路。概括來說,其思路主要是在Excel里插入一個表單控件Texbox,和一個Listbox,通過Texbox的Textchange事件,動態的呈現與輸入相關的數據在列表框Listbox中,並在選擇單元格事件里動態的移動Textbox的位置,使其覆蓋單元格的位置,造成一種在單元格里輸入的假象。這里面,有個巧妙的地方就是利用了List box的visible屬性,以實時更新列表關聯數據。如圖所示。

2.1.1 內置表單控件方式優點:這個效果還是不錯的,包括速度等。優點也很多,比如列表框,可以支持多列內容,而且可以表格化對齊(這個好像很少人會用,大多數是用特殊符合如▲等,將多列內容連接,然后再拆分到表格的不同列,這樣的問題是Listbox里的各列會因為字符原因對不齊,外觀視覺效果也不好。其實大可不必這樣,是有方法的可以做到列表里的各列實行表格化對齊的。),這種開發方式也很方便。

2.1.2 內置表單控件方式不足:要嚴格的說,不足的地方就是用戶體驗不夠好。有網友就和我反應,當調整下列寬之類的,或者其他的正常操作會導致textbox和listbox突然顯示在表中,很突兀,有時候不小心還會被用戶無意刪除,而如果開發者,不處理這種情況,代碼將直接無法繼續運行。而且覆蓋在單元格上,用戶要對單元格進行選中進行一些格式調整等等,也十分不方便。可能不夠友好。

2.2 外載winform窗體方式

       或許是上述表單控件的開發方式的不足,有人用直接掛載一個包含textbox和listbox控件的winform窗體。直接在窗體上操作,脫離表格。通過窗體控件的textbox的keypress或者Textchange事件以及輸入完成擊鍵控制活動單元格的位置,如下圖。

2.2.1 外載窗口優點:開發簡單,可以充分利用Winform控件提供的事件,進行堆代碼式的開發。

2.2.1 外載窗口不足:個人依然覺得,不夠友好,掛載一個窗體操作一個Excel盡管開發上方便了,但顯然不如在單元格里直接輸入來得爽快,直接,有種隔靴搔癢的意味。實際是開發技術不夠的一個妥協解決方案。

2.3 基於單元格的輸入消息捕獲方式(體驗最好)

         總體上來說,目前就我所見和了解就是以上兩種方式,目前為止還沒有人開發出直接在單元格里輸入逐步提示這樣一種方式的,這種需求倒是有網友提過。

  這種方式就是要通過實時捕獲、處理windows消息的技術手段來達到給單元格增加KeyPress事件的目的,並通過加載一個無焦點的ListBox的容器窗體,以動態顯示列表。個人認為這種方式是用戶體驗最好的,直接、爽快,當然實現起來也是最需要技術的。具體作品見ExcelPower_Helper中的錄入提示功能。

 

 

此部分最后,繼續來談下本人作品ExcelPower Helper中的錄入提示,目前支持Google拼音輸入法,搜狗輸入法,百度輸入法,QQ輸入法,以及微軟輸入法,后續將繼續改進,讓其支持更多的輸入法,增加快捷鍵等。客觀來說,能實現到現在的功能,已經可以讓目前的那些逐步錄入提示相形見絀了,又要樹立標桿了。(牛皮又吹起來了^_^)

ExcelPower Helper中的錄入提示  支持模糊匹配,支持拼音首字母檢索,支持被檢索詞以加粗的方式突出顯示與列表框中。支持中英文混合輸入。

 

3.開發技術要點簡述

   

 后來居上,本文最重要的部分,來談一談實現這種方式的簡要原理:

1.用一些工具我們可以看到,Excel中的活動單元格實際是一個不斷調整顯示位置的窗體,其類名為“EXCEL6”,其句柄在Excel的工作簿運行周期中總是固定的。

2.從Windows消息角度看,一切事件都是基於Windows消息的包裝。我們可以通過工具查看當用戶在單元各種輸入內容時候,發生的消息,通過Hook或者微軟提供的基類來對消息進行捕獲攔截。當識別到輸入完成的消息時,做我們的處理,把關聯內容寫入到無焦點的裝載Listbox控件的窗體中,並根據活動單元格的位置將其顯示給用戶。

3,比較難處理的地方是,你要去區分輸入的字符類型和輸入法的狀態,比如英文,數字,中文,不同的輸入法消息類型和對消息的處理及其返回值也不一樣。

4.Excel在Win7和win10下的處理的消息方式還不太一樣。

5.更好的用戶體驗,要考慮匹配的速度和呈現的方式問題,如檢索字在目標條目中突出顯示,加粗等。

6.另外一些需求還可能要用到KEYBOARD Hook。

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

【總結】

         其實這玩意,遠比聚光燈/行列指示/閱讀模式的開發要復雜,聚光燈,也是捕獲消息,但是要考慮的東西比較單一。錄入提示涉及到輸入法的這一部分就夠考驗人的。各大輸入法都有自己方式。要摸清他們的消息的遞送邏輯也是很費事的。

        接下來會發一篇關於高級任務窗格的文章,簡述原理。高級任務窗格這個詞早已有之,國外有專門賣這個的。所以是有根據的,高不高級另說,先告訴大家怎么實現才是最重要的,下一篇見。

        祝各位看官,安好。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM