问题背景:
做了CS项目来完成word的实时同步,如某个客户端(A)输入一个字(句子),另一个客户端(B)显示了这个字(句子)。
word操作过程中使用的Range对象的InsertAfter来完成插入,最后通过Range的Select函数来完成定位到光标处,这样客户B就能实时的看到客户端A输入的内容。
但现在的问题是Select会抢光标焦点。如客户端(B)自己打开了任意doc文件在编辑,在编辑的过程中焦点老是被客户端B中的word抢去。
实验根据现象,发现可能的方案:
一 :不同winword.exe进程中的word相互不抢焦点。
发现通常情况下,任务管理器中只有一个winword.exe。如果让客户端B中的word使用单独的一个winword.exe即不会抢焦点。此方法存在一个问题,用户通过双击doc文件打开word时,会依附于任务管理器中的任一个winword.exe。那么就会出现客户端B中使用的word对应的winword.exe与双击doc文件打开的word对应一个winword.exe相同。此问题暂时不知怎么解决。
二: word对象模型中的Pane对象的PageScroll不会抢焦点。
那么就可以使用PageScroll来实现将当前窗口挪动到Range位置来实现定位的功能。
思路大概是:
1)获得Range所在的页,以及所在页中的百分比位置。
2)将窗口挪到Range所在的页
3)根据Range在上半页还是下半页,来使窗口不动还是微调半页。
具体:
1)获得Range所在的页,以及所在页中的百分比位置。
Range的GetInformation(wdActiveEndPageNumber)方法来获得range所在页。
Range的GetInformation(wdVerticalPositionRelativeToPage)方法及GetPageSetup()->GetPageHeight()方法来得到百分比。
2)将窗口挪到Range所在的页。
调用View的PutDisplayPageBoundaries(TRUE)
调用Window的PageScroll将窗口先挪到首页。(此函数执行时用try catch包住,因为在没有上页时执行此操作会抛异常)
再Window的PageScroll将窗口挪动到Range所在页。
3)
调用Window的SmallScroll来微调。正常页面情况下40,50下为半页。
在100页范围内可使用GetVerticalPercentScrolled来做一些逻辑,能基本准确定位。
三:
直接调用Window的ScrollIntoView方法。此方法的参数为Range对象。
最终采用方案三