VBIDE默认是MDI的布局方式.
想实现这样的一个功能:在插件中双击列表中的一个条目,就可以让代码窗口中的某些内容被选中.
因为CodePane提供了SetSelection方法,Window对象提供了SetFocus方法,所以这个功能并不难实现,而且在需要显示的代码窗体还没有显示的时候工作正常;但是如果一个代码窗体已经打开并且显示出来了,SetFocus方法并不能让此窗体获得焦点,这就导致选中的内容无法显示出来,只有用鼠标点击代码窗体后才可以让选中内容显示出来.
With CodeObject.CodePane
Call .SetSelection(Y1, ScreenX1, Y2, ScreenX2)
Call .Window.SetFocus
DoEvents
End With
如果首先隐藏窗体的话,可以解决此问题,但效果不是很好(因为会有闪动现象):
With CodeObject.CodePane
.Window.Visible = False
Call .SetSelection(Y1, ScreenX1, Y2, ScreenX2)
Call .Window.SetFocus
DoEvents
End With
请问是否有更好的方式解决此问题呢?
想实现这样的一个功能:在插件中双击列表中的一个条目,就可以让代码窗口中的某些内容被选中.
因为CodePane提供了SetSelection方法,Window对象提供了SetFocus方法,所以这个功能并不难实现,而且在需要显示的代码窗体还没有显示的时候工作正常;但是如果一个代码窗体已经打开并且显示出来了,SetFocus方法并不能让此窗体获得焦点,这就导致选中的内容无法显示出来,只有用鼠标点击代码窗体后才可以让选中内容显示出来.
With CodeObject.CodePane
Call .SetSelection(Y1, ScreenX1, Y2, ScreenX2)
Call .Window.SetFocus
DoEvents
End With
如果首先隐藏窗体的话,可以解决此问题,但效果不是很好(因为会有闪动现象):
With CodeObject.CodePane
.Window.Visible = False
Call .SetSelection(Y1, ScreenX1, Y2, ScreenX2)
Call .Window.SetFocus
DoEvents
End With
请问是否有更好的方式解决此问题呢?
有两种情况:
第一种情况是UserDocument没有链接到VB窗体中,此种方式没有SetFocus无效的问题.
第二中情况是UserDocument嵌入到VB窗体中,此时就会出现上述的问题了.
Show 或 SetFocus 应该都没问题,可能是你的鼠标事件没有完全结束,最后焦点又回到了你的窗体上。
可以考虑加一个 Timer 控件,用极小的定时间隔后再执行 SetFocus。
我刚才试了一下您说的方法,将定位操作放到timer中.
其中timer的interval:
50
100
1000
都试过了,还是不行:-(
应该比隐藏 CodePanel 的方式的闪动小。
Call SendMessage(GetCodeWindowHandle(w), &H1043, 0, 0)