在VB开发中,向窗口上添加控件有两种方法,一是设计阶段,一是运行阶段。比较简单的是在设计阶段完成的。但很多时候我们无法确定需要多少个控件,比如编写一个多页记事本,我们不可能在设计阶段就添加几十或上百个编辑框在窗口上,因为你不知道用户会打开多少个文件。
在程序运行阶段用代码动态添加控件是一种常见的方法。如上面的例子中我们就需要动态添加编辑框,用户每打开一个文件,就动态添加一个编辑框。
动态添加控件使用controls对象的add方法,格式:
controls.add (添加控件的类名,控件的名称,所属的父窗体)
下面是我写好的一个多页面记事本的框架。动态添加和引用部分我都已经写好了,没有写编辑功能的代码。如果你想拥有一个自己的记事本,可以下载后自己添加相关的代码,给自己打造一个适合自己的记事本。
动态添加、引用控件的相关代码
Private
Sub mnuFileNew_
Click ()
'新建
Call addtab
End Sub
Private Sub addtab() '新建时动态添加编辑控件
Dim a As MSWLess.WLText
Dim i As Integer
Dim hd As Long
SSTab1.Tabs = SSTab1.Tabs + 1
SSTab1.Tab = SSTab1.Tabs - 1
i = SSTab1.Tabs
SSTab1.TabsPerRow = i + 1
Set a = Me.Controls.Add( "MSWLess.WLText" , "rtbox" & CStr (i - 1), SSTab1) '第3个参数指定了父窗体为SSTab1
a.Move 60, 360, sw, sh
a.Tag = i - 1
Debug. Print i, SSTab1.Tab, a.Tag, a.Name
a. Text = "新文件" & CStr (i)
SSTab1.Caption = "新文件" & CStr (i)
a.Visible = True
a.MultiLine = True
a.ScrollBars = wlVertical
' hd = SetParent(a.hWnd, SSTab1.hWnd) ‘这里就可以不用指定父窗体了
End Sub
Private Sub Form _Resize() '同步缩放
SSTab1.Width = Me.Width - 100
SSTab1.Height = Me.ScaleHeight - 670
sw = SSTab1.Width - 125
sh = SSTab1.Height - 425
sl = 60
st = 360
'---------------- 以下引用动态控件 ------------------------------
Dim i As Integer
Dim a As String
i = SSTab1.Tab
a = "rtbox" & CStr (i)
If a = "rtbox0" Then a = "wltext1"
Me.Controls(a).Move 60, 360, sw, sh
'------也可以用下面的方法调整全部编辑框大小-------
' Dim b As Control
' For Each b In Me.Controls
' If TypeOf b Is WLText Then
' b.Move 60, 360, sw, sh
' End If
' Next
End Sub
Private Sub SSTab1_ Click (PreviousTab As Integer)
Dim i As Integer
Dim tb As WLText
If SSTab1.Tab = 0 Then
WLText1.Move 60, 360, sw, sh
End If
'--------------- 重要:根据名称引用动态控件 / 点击TAB标签时自动缩放当前页 -----------------
Dim a As Control
For Each a In Me.Controls
If TypeOf a Is WLText Then
If a.Name = "rtbox" & SSTab1.Tab Then
a.Move 60, 360, sw, sh
End If
End If
Next
End Sub
Private Sub SSTab1_DblClick() '双击隐藏当前文章
Dim i As Integer
i = SSTab1.Tab
If i <> 0 Then SSTab1.TabVisible(i) = False
End Sub
Private Sub mnuFileOpen_ Click () '打开文件
Dim sFile As String
Dim i As Integer
Dim a As String
Dim string1 As String
With dlgCommonDialog
.DialogTitle = "打开"
.CancelError = False
. Filter = "所有文件 (*.*)|*.*"
.ShowOpen
If Len (.FileName) = 0 Then
Exit Sub
End If
sFile = .FileName
Open dlgCommonDialog.FileName For Input As #1
string1 = StrConv(InputB$(LOF(1), 1), vbUnicode)
'---------------- 以下引用动态控件 ------------------------------
i = SSTab1.Tab
a = "rtbox" & CStr (i)
If a = "rtbox0" Then a = "wltext1"
Me.Controls(a). Text = string1
'-------------------------------------------------------------------
Close #1
End With
End Sub
Call addtab
End Sub
Private Sub addtab() '新建时动态添加编辑控件
Dim a As MSWLess.WLText
Dim i As Integer
Dim hd As Long
SSTab1.Tabs = SSTab1.Tabs + 1
SSTab1.Tab = SSTab1.Tabs - 1
i = SSTab1.Tabs
SSTab1.TabsPerRow = i + 1
Set a = Me.Controls.Add( "MSWLess.WLText" , "rtbox" & CStr (i - 1), SSTab1) '第3个参数指定了父窗体为SSTab1
a.Move 60, 360, sw, sh
a.Tag = i - 1
Debug. Print i, SSTab1.Tab, a.Tag, a.Name
a. Text = "新文件" & CStr (i)
SSTab1.Caption = "新文件" & CStr (i)
a.Visible = True
a.MultiLine = True
a.ScrollBars = wlVertical
' hd = SetParent(a.hWnd, SSTab1.hWnd) ‘这里就可以不用指定父窗体了
End Sub
Private Sub Form _Resize() '同步缩放
SSTab1.Width = Me.Width - 100
SSTab1.Height = Me.ScaleHeight - 670
sw = SSTab1.Width - 125
sh = SSTab1.Height - 425
sl = 60
st = 360
'---------------- 以下引用动态控件 ------------------------------
Dim i As Integer
Dim a As String
i = SSTab1.Tab
a = "rtbox" & CStr (i)
If a = "rtbox0" Then a = "wltext1"
Me.Controls(a).Move 60, 360, sw, sh
'------也可以用下面的方法调整全部编辑框大小-------
' Dim b As Control
' For Each b In Me.Controls
' If TypeOf b Is WLText Then
' b.Move 60, 360, sw, sh
' End If
' Next
End Sub
Private Sub SSTab1_ Click (PreviousTab As Integer)
Dim i As Integer
Dim tb As WLText
If SSTab1.Tab = 0 Then
WLText1.Move 60, 360, sw, sh
End If
'--------------- 重要:根据名称引用动态控件 / 点击TAB标签时自动缩放当前页 -----------------
Dim a As Control
For Each a In Me.Controls
If TypeOf a Is WLText Then
If a.Name = "rtbox" & SSTab1.Tab Then
a.Move 60, 360, sw, sh
End If
End If
Next
End Sub
Private Sub SSTab1_DblClick() '双击隐藏当前文章
Dim i As Integer
i = SSTab1.Tab
If i <> 0 Then SSTab1.TabVisible(i) = False
End Sub
Private Sub mnuFileOpen_ Click () '打开文件
Dim sFile As String
Dim i As Integer
Dim a As String
Dim string1 As String
With dlgCommonDialog
.DialogTitle = "打开"
.CancelError = False
. Filter = "所有文件 (*.*)|*.*"
.ShowOpen
If Len (.FileName) = 0 Then
Exit Sub
End If
sFile = .FileName
Open dlgCommonDialog.FileName For Input As #1
string1 = StrConv(InputB$(LOF(1), 1), vbUnicode)
'---------------- 以下引用动态控件 ------------------------------
i = SSTab1.Tab
a = "rtbox" & CStr (i)
If a = "rtbox0" Then a = "wltext1"
Me.Controls(a). Text = string1
'-------------------------------------------------------------------
Close #1
End With
End Sub
源码下载: