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
请问是否有更好的方式解决此问题呢?

解决方案 »

  1.   

    对了,这个列表是放在一个UserDocument(ActiveX Document)中的.
    有两种情况:
    第一种情况是UserDocument没有链接到VB窗体中,此种方式没有SetFocus无效的问题.
    第二中情况是UserDocument嵌入到VB窗体中,此时就会出现上述的问题了.
      

  2.   

    不需要操作 WindowCodeObject.CodePane.Show
      

  3.   

    你的意思是类似查找对话框,找到的文本被选中,焦点在代码窗口,选中文本是蓝底白字?
    Show 或 SetFocus 应该都没问题,可能是你的鼠标事件没有完全结束,最后焦点又回到了你的窗体上。
    可以考虑加一个 Timer 控件,用极小的定时间隔后再执行 SetFocus。
      

  4.   

    是的,我是想根据列表内容定位搜索结果,和查找对话框类似..
    我刚才试了一下您说的方法,将定位操作放到timer中.
    其中timer的interval:
    50
    100
    1000
    都试过了,还是不行:-(
      

  5.   

    可以反过来试试:先将 Add-in 自己的窗体隐藏,再定位 CodePanel 的焦点,最后用 API ShowWindow 的 SW_SHOWNOACTIVATE 方式显示自己的窗体。
    应该比隐藏 CodePanel 的方式的闪动小。
      

  6.   

    原来VB中使用自定义消息来显示焦点,下边是完美解决方案:
    Call SendMessage(GetCodeWindowHandle(w), &H1043, 0, 0)