昨天才发现,通过模拟鼠标滚轮来使Html页面滚动的方式,在有 备注 的情况下会出错的。因为 备注 是在htmlview的parent (childframe)上画出来的。页面滚动之后,备注 所标注的内容的位置发生了变化,如果不改变 备注 的位置就不对了。
 
没有办法,只能获取htmlview之内的滚动条的完整控制权,才能精确定位 标注 的位置。
 
去网上查找了一些资料,可以通过IHTMLWindow2的scrollTo函数来控制htmlview的滚动。
 
代码顺利写好,调试时出了问题。发现只要发生滚动事件,调用了IHTMLWindow2 的scrollTo接口,就会导致mshtml.dll内部发生内存访问问题。百思不解啊。
 
后来在view里面设置了一个timer,定时调用scrollTo来让页面自动滚动,发现这个方法可以。想来想去,有可能是Thread引起的问题。
 
由于我的手指移动事件是在另外一个线程里面捕捉到的,那么scrollTo的调用就是在另外一个线程内被触发。那么就说明 IHTMLWindow2的这些接口是线程不安全的?
 
之后我改变了一下调用方式,避免在线程内部直接触发scrollTo函数,结果一切都很顺利。
 
有个印象:COM初始化时候是有一个和线程安全有关的参数的,过两天等缓过来再去看看。
昨天查了很多IHTML****的接口说明,看到MS有些关于Markup的接口,是不是可以通过这些接口来做标注呢?而不用现在这样在它的parent frame上来画?