使用NewWindow2事件并尝试以模态方式显示新表单

时间:2014-04-30 22:03:06

标签: vb6 webbrowser-control

我的vb表单上有一个浏览器控件,实现NewWindow2事件以捕获新窗口请求并将其发送到我的表单的另一个实例,根据这篇MS文章:How To Use the WebBrowser Control NewWindow2 Event

当新表单以非模态显示时,这工作正常。但是当窗体以模态显示时,浏览器控件不会加载。

代码示例:创建一个新项目,向表单添加一个命令按钮和浏览器控件。添加以下代码。

Private Sub Command1_Click()
  WebBrowser1.Navigate2 "www.microsoft.com"
End Sub

Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
  Dim ofrm As Form1
  Set ofrm = New Form1
  ofrm.WebBrowser1.RegisterAsBrowser = True
  Set ppDisp = ofrm.WebBrowser1.Object
  ofrm.Show 'vbModal
End Sub

运行项目,单击命令按钮,将显示该网站。按住Shift键并单击一个超链接(或右键单击并选择“在新窗口中打开”),将加载一个新的Form1实例,并显示单击的超链接网站。

但是在未注释“vbmodal”的情况下运行,并且在显示新的Form1之后,浏览器控件未加载新网站。

如何让这个以新模式显示为模态?

由于

修改

我自己的错! NewWindow2事件需要在新浏览器窗口能够显示站点内容之前完成。由于在事件处理程序中显示表单模式将无法在卸载表单之前完成事件处理程序,当然浏览器控件保持为空!

根据Noseratio的建议,要求执行基本上异步的模态表单显示。在VB6-land中,使用计时器可以轻松完成。

对于上面的代码示例,还要向表单添加一个计时器控件,确保它最初未启用,然后使用以下代码:

Private Sub Command1_Click()
  WebBrowser1.Navigate2 "www.microsoft.com"
End Sub

Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
  Dim ofrm As Form1
  Set ofrm = New Form1
  ofrm.WebBrowser1.RegisterAsBrowser = True
  Set ppDisp = ofrm.WebBrowser1.Object
  Timer1.Interval = 50
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
  Timer1.Enabled = False
  ofrm.Show vbModal
End Sub

1 个答案:

答案 0 :(得分:0)

尝试异步显示表单:

Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
  Dim ofrm As Form1
  Set ofrm = New Form1
  ofrm.WebBrowser1.RegisterAsBrowser = True
  Set ppDisp = ofrm.WebBrowser1.Object

  Private Sub goModal()
      ofrm.Show vbModal      
  End Sub

  SynchronizationContext.Current.Post(AddressOf goModal, Nothing)  
End Sub