VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 在VB中动态添加可响应消息的控件
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:11330, 日期:2002-02-09
在VB中动态添加可响应消息的控件
    在VB编程中,经常要根据不同的情况在运行时向窗口中添加或者删除控件,而各个控件还要
响应各种事件。在一般的情况下是首先在设计时将控件加入到窗口中,在它们的各个事件中写入
代码,然后将它们的Visible属性设置为False。在运行时再使控件显示出来,但是这样既不方便
同时也因为在设计时在窗口中加入太多的控件而使得程序的运行速度变慢。下面我向大家介绍一
种通过编程在运行时动态添加和删除控件的方法
    首先建立一个工程文件,然后在Form1中加入以下的代码:
    Dim WithEvents cmdMyCommand As VB.CommandButton
    Option Explicit
    注释:在下面的定义中,程序定义了一个TextBox控件、一个CommandButton控件
    注释:和一个附加控件。
    Dim WithEvents ctlDynamic As VBControlExtender
    Dim WithEvents ctlText As VB.TextBox
    Dim WithEvents ctlCommand As VB.CommandButton
    Dim WithEvents ctlCommandDel As VB.CommandButton
    Private Sub ctlCommandDel_Click()
        Dim i As Integer
        
        注释:将控件的许可证信息删除
        Licenses.Remove "MSComctlLib.TreeCtrl"
        If MsgBox("是否删除所有控件", vbYesNo) = vbYes Then
        For i = 1 To Form1.Controls.Count
            Controls.Remove 0
        Next i
        End If
    End Sub
    Private Sub ctlCommand_Click()
        ctlText.Text = "你点击的是控制按钮"
    End Sub

    Private Sub ctlDynamic_ObjectEvent(Info As EventInfo)
        注释:当点击树形控件的某一个条目后,在ctlText中显示条目。
        If Info.Name = "Click" Then
            ctlText.Text = "你点击的条目是 " & _
                    ctlDynamic.object.selecteditem.Text
        End If
    End Sub

    Private Sub Form_Load()
        Dim i As Integer
        注释: 将树形控件的许可证信息加入到许可证集合中
        注释: 如果许可证已经存在,则会返回错误信息732
        Licenses.Add "MSComctlLib.TreeCtrl"

        注释: 在Form中动态的加入一个树形控件,如果你想树形控件建立到不同的
        注释:容器中,象一个Frame控件或者PictureBox控件,你只要将Controls.Add
        注释:函数的第三个参数改为特定的容器名就可以了
        Set ctlDynamic = Controls.Add("MSComctlLib.TreeCtrl", _
                        "myctl", Form1)
        注释:设置树形控件的位置和尺寸
        ctlDynamic.Move 1, 1, 2500, 3500
        注释:在树形控件中加入10个节点
        For i = 1 To 10
            ctlDynamic.object.nodes.Add Key:="Test" & Str(i), _
                    Text:="Test" & Str(i)
            ctlDynamic.object.nodes.Add Relative:="Test" & Str(i), _
                    Relationship:=4, Text:="TestChild" & Str(i)
        Next i
        注释:使树形控件可见
        ctlDynamic.Visible = True

        注释:加入一个TextBox
        Set ctlText = Controls.Add("VB.TextBox", "ctlText1", Form1)
        注释:设置TextBox的位置和尺寸
        ctlText.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
                        1, 2500, 100
        注释:将textBox的背景色设置为蓝色并将前景色设置为白色
        ctlText.BackColor = vbBlue
        ctlText.ForeColor = vbWhite
        注释:使TextBox可见
        ctlText.Visible = True

        注释:加入一个CommandButton
        Set ctlCommand = Controls.Add("VB.CommandButton", _
                        "ctlCommand1", Form1)
        注释:设置CommandButton的位置和尺寸
        ctlCommand.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
                        ctlText.Height + 50, 1500, 500
        注释:设置CommandButton的标题
        ctlCommand.Caption = "点击"
        注释:使CommandButton可见
        ctlCommand.Visible = True
        
        注释:建立一个删除按钮
        Set ctlCommandDel = Controls.Add("VB.CommandButton", _
                        "ctlCommand2", Form1)
        ctlCommandDel.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
                        ctlText.Height + 650, 1500, 500
        ctlCommandDel.Caption = "删除所有控件"
        ctlCommandDel.Visible = True
    End Sub
    运行上面的程序,可以看到程序在窗口中加入了三个VB标准控件:一个TextBox和两个
CommandButton还加入了一个扩展的ActiveX控件:树形控件。这些控件还可以响应消息,
点击树形控件中的项目或者“点击”按钮就可以在文本框中显示相应的内容。点击“删除
所有控件”按钮就可以删除加入的所有控件了。
    通过上面的程序可以看到,通过WithEvents可以定义带事件相应的控件,对于标准的VB
控件(例如CommandButton、TextBox等)可以通过VB.XXX来定义,其中XXX是控件的类的名称
,而对于扩展的ActiveX控件,可以通过VBControlExtender来定义,在装载扩展控件以前,
首先要使用Licenses对象加入控件的许可证信息。
    上面的程序在VB6,WIN98中文版下运行通过。