在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
源碼下載: