在VB.Net中,我试图在用户单击按钮时向表单添加QuickTime ActiveX控件。
我的代码如下。为了测试,我有一个设计时的ActiveX控件,“designed_control”,它工作正常,但我正在尝试将“dynamic_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:'消息框,表明正在设置dynamic_created_control的属性而且对象不是什么。然而,我期望的控件的矩形形状不会出现在表格上。一旦我调用控件的.Play()方法,它就会引发异常,因为.Movie什么都不是,什么时候不应该。
当基于设计人员的版本绝对正常时,有人能发现为什么动态生成的ActiveX控件不会出现(但不会抛出错误)吗?
顺便说一下,我知道围绕QuickTime的安全问题,这就是为什么我现在正在尝试编写一些代码,如果用户决定可以选择使用QuickTime。
由于
答案 0 :(得分:0)
我相信您可能需要更新buttonCreateNewControl_Click才能使用
.OcxState = CType(resources.GetObject("dynamically_created_control.OcxState"), System.Windows.Forms.AxHost.State)
希望这有帮助。
答案 1 :(得分:0)
我在代码中发现了错误。
.createControl()方法试图创建一个外部QuickTime窗口。该控件适用于像VLC Player这样的东西,但QuickTime不支持它,所以什么也没发生。
一旦我注释掉createControl(),行为就变成了我所期待的。
.createControl()是我在网上找到的代码的剩余部分,我认为它对于启动ActiveX控件至关重要,但它不是。