2016-04-22 69 views
0

在VB.Net中,当用户点击一个按钮时,我试图添加一个QuickTime ActiveX控件到窗体。动态添加一个ActiveX控件到VB.Net窗体什么也不做

我的代码如下。为了测试,我有一个设计时的ActiveX控件“designed_control”,它工作正常,但我试图将“dynamically_created_control”放在窗体上。

Public Class Form1 

Private moviePath As String = "\\localhost\D$\Temp\Test.mov" 
Friend WithEvents dynamically_created_control As AxQTOControlLib.AxQTControl = Nothing 

Private Sub buttonLoadMovieIntoExisting_Click(sender As Object, e As EventArgs) Handles buttonLoadMovieIntoExisting.Click 
    ' load movie into control created in designer, works fine: 
    MessageBox.Show(moviePath) 
    With designed_control 
     .URL = moviePath 
     MessageBox.Show("URL:" + .URL) 
    End With 
End Sub 

Private Sub buttonCreateNewControl_Click(sender As Object, e As EventArgs) Handles buttonCreateNewControl.Click 
    ' create a new ActiveX control when button is clicked: 
    dynamically_created_control = New AxQTOControlLib.AxQTControl 
    CType(dynamically_created_control, System.ComponentModel.ISupportInitialize).BeginInit() 
    Me.SuspendLayout() 
    Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1)) 
    With dynamically_created_control 
     .CreateControl() 
     .Enabled = True 
     .Location = New System.Drawing.Point(160, 160) 
     .Name = "new_control" 
     .OcxState = CType(resources.GetObject("designed_control.OcxState"), System.Windows.Forms.AxHost.State) 
     .Size = New System.Drawing.Size(480, 270) 
     .TabIndex = 0 
     Me.Controls.Add(Me.dynamically_created_control) 
     .Visible = True 
     .URL = moviePath 
    End With 
    CType(dynamically_created_control, System.ComponentModel.ISupportInitialize).EndInit() 
    Me.ResumeLayout(True) 
    With dynamically_created_control 
     MessageBox.Show("URL:" + vbCrLf + .URL) 
     .Movie.Play() 
    End With 
End Sub 

End Class 

这是行不通的;当我点击'buttonCreateNewControl'时,它会弹出'URL:'消息框,显示正确的URL,显示了正在设置的属性dynamiscreated_control和对象不是什么。但是,我期望的控件的矩形形状不会出现在窗体上。只要我调用控件的.Play()方法,就会引发一个异常,因为.Movie什么也不是,当它不应该的时候。

任何人都可以发现为什么动态生成的ActiveX控件根本不会出现(但没有抛出错误),当基于设计器的版本是绝对好的?

顺便说一句,我知道QuickTime的安全问题,这就是为什么我现在试图编码的东西,可以可选如果用户决定使用QuickTime。

感谢

回答

0

我相信你可能需要更新buttonCreateNewControl_Click使用

.OcxState = CType(resources.GetObject("dynamically_created_control.OcxState"), System.Windows.Forms.AxHost.State) 

希望这有助于。

+0

不幸的是,此更改不会影响结果。有关使用来自不同控件的ocxState的信息来自以下网站:http://www.softelvdm.com/Support/NETDynamicallyCreatedControls/tabid/150/。事实上,你所提出的改变并没有什么不同,这让我认为设置OcxState的这一行代码可能仍是问题,但我不知道如何正确设置新的OcxState。 –

0

我在我的代码中发现了错误。

.createControl()方法试图创建外部QuickTime窗口。该控件适用于VLC Player之类的东西,但QuickTime不支持它,所以没有任何事情发生。

只要我注释了createControl(),行为就成了我期待的。

.createControl()是我在网上找到的代码中的一个剩余部分,我认为这对于启动ActiveX控件是非常重要的,但事实并非如此。

相关问题