'新建一个Clase,取名:FormScroll '这个Class的作用是给Form加上滚卷条, 当屏幕分辨率变化,或者其他原因导致Form不能容纳所有控件时可以使用 '要试用的话,在任何一个Form上添加以下代码(为了试验效果,可在Form上多方点控件) '**********************以下代码添加到Form中************************* 'Dim aa As New FormScroll ' 'Private Sub Form_Activate() ' aa.FormScrol_InitSize 'End Sub ' 'Private Sub Form_Load() ' Set aa.TargetForm = Me ' aa.FormScrol_Init 'End Sub'Private Sub Form_Resize() ' aa.FormScrol_Disp 'End Sub '*******************************************************************Option ExplicitPrivate Type ControlName HsName As String VsName As String PicName As String End TypePrivate oForm As Form Private oCtlName As ControlName'*****下面这些参数决定滚动条外观和特性 Private BlockSize '滚动条滑块大小 Private ChangeUnitX '水平托动的速度 Private ChangeUnitY '垂直托动的速度 Private FormMinHeight 'Form允许的最小高度 Private FormMinWidth 'Form允许的最小宽度 Private ScrollWidth '滚动条宽度 Private FormControls As New Collection Private WithEvents FormHScroll As HScrollBar Private WithEvents FormVScroll As VScrollBar Private picScrol As PictureBoxPrivate ScrolStat As Integer Private hh As Single, ww As Single Private ohh As Single, ovv As Single '初始化,给Form加入所需控件 Public Sub FormScrol_Init() ScrolStat = 0
oCtlName = GetControlName Set FormHScroll = oForm.Controls.Add("VB.HScrollBar", oCtlName.HsName, oForm) Set FormVScroll = oForm.Controls.Add("VB.VScrollBar", oCtlName.VsName, oForm) Set picScrol = oForm.Controls.Add("VB.PictureBox", oCtlName.PicName, oForm)
FormHScroll.Value = 0 FormVScroll.Value = 0End Sub'判断窗体上所有可见的控件占的空间,窗体第一次显示,或者增减,或改变控件(比如Visible属性)导致空间变化时需调用此方法 Public Sub FormScrol_InitSize() Dim cont As Control For Each cont In oForm.Controls If (cont.Container.Name = oForm.Name) And (cont.Name <> oCtlName.HsName) And (cont.Name <> oCtlName.VsName) And (cont.Name <> oCtlName.PicName) Then FormControls.Add Item:=cont End If Next hh = 0 ww = 0 For Each cont In FormControls If cont.Visible Then If cont.Left + cont.Width > ww Then ww = cont.Left + cont.Width If cont.Top + cont.Height > hh Then hh = cont.Top + cont.Height End If Next End Sub'决定滚卷条是否显示及如何显示,一般在Form_Resize时调用 Public Sub FormScrol_Disp() Dim shh As Single, sww As Single
If oForm.Height < FormMinHeight Then oForm.Height = FormMinHeight If oForm.Width < FormMinWidth Then oForm.Width = FormMinWidth
sww = oForm.ScaleWidth - ScrollWidth * ((2 And ScrolStat) / 2) shh = oForm.ScaleHeight - ScrollWidth * (1 And ScrolStat) If ww > sww Then FormHScroll.Visible = True ScrolStat = ScrolStat Or 1 Else FormHScroll.Value = 0 FormHScroll.Visible = False ScrolStat = Not (Not ScrolStat Or 1) End If
If hh > shh Then FormVScroll.Visible = True ScrolStat = ScrolStat Or 2 Else FormVScroll.Value = 0 FormVScroll.Visible = False ScrolStat = Not (Not ScrolStat Or 2) End If picScrol.Visible = (ScrolStat = 3) If picScrol.Visible Then picScrol.Top = oForm.ScaleHeight - ScrollWidth If picScrol.Visible Then picScrol.Left = oForm.ScaleWidth - ScrollWidth
If (ScrolStat And 1) Then FormHScroll.Top = oForm.ScaleHeight - ScrollWidth * (1 And ScrolStat) FormHScroll.Width = oForm.ScaleWidth - ScrollWidth * ((2 And ScrolStat) / 2) FormHScroll.Max = (oForm.ScaleX(ww, oForm.ScaleMode, vbPixels) - oForm.ScaleX(sww, oForm.ScaleMode, vbPixels)) / ChangeUnitX FormHScroll.Min = 0 End If
If (ScrolStat And 2) Then FormVScroll.Height = oForm.ScaleHeight - ScrollWidth * (1 And ScrolStat) FormVScroll.Left = oForm.ScaleWidth - ScrollWidth * ((2 And ScrolStat) / 2) FormVScroll.Max = (oForm.ScaleY(hh, oForm.ScaleMode, vbPixels) - oForm.ScaleY(shh, oForm.ScaleMode, vbPixels)) / ChangeUnitY FormVScroll.Min = 0 End If End Sub'为了避免跟已存在的控件重名,用随机数决定滚卷条控件名称 Private Function GetControlName() As ControlName Dim cname As ControlName Dim I As Integer Dim bolCtlExt As Boolean On Error Resume Next Randomize For I = 1 To 20 cname.HsName = "tmp_form_hscroll_" & CStr(CInt(Rnd * 10000)) bolCtlExt = False Err.Clear bolCtlExt = oForm.Controls(cname.HsName).Name = cname.HsName If Not bolCtlExt Then Exit For If I = 20 Then Err.Raise 525, "FormScroll", "不能创建控件名称:" & cname.VsName Next I
For I = 1 To 20 cname.VsName = "tmp_form_vscroll_" & CStr(CInt(Rnd * 1000)) bolCtlExt = False bolCtlExt = oForm.Controls(cname.VsName).Name = cname.VsName If Not bolCtlExt Then Exit For If I = 20 Then Err.Raise 525, "FormScroll", "不能创建控件名称:" & cname.VsName Next I
For I = 1 To 20 cname.PicName = "tmp_form_pic_" & CStr(CInt(Rnd * 1000)) bolCtlExt = False bolCtlExt = oForm.Controls(cname.VsName).Name = cname.VsName If Not bolCtlExt Then Exit For If I = 20 Then Err.Raise 525, "FormScroll", "不能创建控件名称:" & cname.PicName Next I
GetControlName = cname End Function'移动窗体上的控件,实现滚卷功能 Private Sub FormScrol_Scroll() Dim cont As Control Dim xx As Single, yy As Single
For Each cont In FormControls cont.Move cont.Left + xx, cont.Top + yy Next
FormScrol_Disp End Sub'初始化一些参数 Private Sub Class_Initialize() BlockSize = 20 ChangeUnitX = 5 ChangeUnitY = 5 FormMinHeight = 2000 FormMinWidth = 2000 ScrollWidth = 250 End Sub'退出时释放对象变量 Private Sub Class_Terminate() Set FormHScroll = Nothing Set FormVScroll = Nothing Set picScrol = Nothing End Sub'用户点击水平滚卷条时,触发事件 Private Sub FormHScroll_Change() FormScrol_Scroll End Sub'用户点击垂直滚卷条时,触发事件 Private Sub FormVScroll_Change() FormScrol_Scroll End Sub'TargetForm属性用于设定目标Form Public Property Get TargetForm() As Form Set targeform = oForm End PropertyPublic Property Set TargetForm(ByVal vNewValue As Form) Set oForm = vNewValue End Property
所有的控件放picture上,然後用滾動條控制它的TOP和LEFT。
'这个Class的作用是给Form加上滚卷条, 当屏幕分辨率变化,或者其他原因导致Form不能容纳所有控件时可以使用
'要试用的话,在任何一个Form上添加以下代码(为了试验效果,可在Form上多方点控件)
'**********************以下代码添加到Form中*************************
'Dim aa As New FormScroll
'
'Private Sub Form_Activate()
' aa.FormScrol_InitSize
'End Sub
'
'Private Sub Form_Load()
' Set aa.TargetForm = Me
' aa.FormScrol_Init
'End Sub'Private Sub Form_Resize()
' aa.FormScrol_Disp
'End Sub
'*******************************************************************Option ExplicitPrivate Type ControlName
HsName As String
VsName As String
PicName As String
End TypePrivate oForm As Form
Private oCtlName As ControlName'*****下面这些参数决定滚动条外观和特性
Private BlockSize '滚动条滑块大小
Private ChangeUnitX '水平托动的速度
Private ChangeUnitY '垂直托动的速度
Private FormMinHeight 'Form允许的最小高度
Private FormMinWidth 'Form允许的最小宽度
Private ScrollWidth '滚动条宽度
Private FormControls As New Collection
Private WithEvents FormHScroll As HScrollBar
Private WithEvents FormVScroll As VScrollBar
Private picScrol As PictureBoxPrivate ScrolStat As Integer
Private hh As Single, ww As Single
Private ohh As Single, ovv As Single
'初始化,给Form加入所需控件
Public Sub FormScrol_Init()
ScrolStat = 0
oCtlName = GetControlName
Set FormHScroll = oForm.Controls.Add("VB.HScrollBar", oCtlName.HsName, oForm)
Set FormVScroll = oForm.Controls.Add("VB.VScrollBar", oCtlName.VsName, oForm)
Set picScrol = oForm.Controls.Add("VB.PictureBox", oCtlName.PicName, oForm)
FormHScroll.Height = ScrollWidth
FormVScroll.Width = ScrollWidth
FormHScroll.Left = 0
FormVScroll.Top = 0
FormHScroll.TabStop = False
FormVScroll.TabStop = False
FormHScroll.LargeChange = BlockSize
FormVScroll.LargeChange = BlockSize
FormHScroll.Value = 0
FormVScroll.Value = 0
picScrol.Enabled = False
picScrol.Width = ScrollWidth
picScrol.Height = ScrollWidth
FormHScroll.ZOrder 0
FormVScroll.ZOrder 0
picScrol.ZOrder 0
FormHScroll.Value = 0
FormVScroll.Value = 0End Sub'判断窗体上所有可见的控件占的空间,窗体第一次显示,或者增减,或改变控件(比如Visible属性)导致空间变化时需调用此方法
Public Sub FormScrol_InitSize()
Dim cont As Control
For Each cont In oForm.Controls
If (cont.Container.Name = oForm.Name) And (cont.Name <> oCtlName.HsName) And (cont.Name <> oCtlName.VsName) And (cont.Name <> oCtlName.PicName) Then
FormControls.Add Item:=cont
End If
Next
hh = 0
ww = 0
For Each cont In FormControls
If cont.Visible Then
If cont.Left + cont.Width > ww Then ww = cont.Left + cont.Width
If cont.Top + cont.Height > hh Then hh = cont.Top + cont.Height
End If
Next
End Sub'决定滚卷条是否显示及如何显示,一般在Form_Resize时调用
Public Sub FormScrol_Disp()
Dim shh As Single, sww As Single
If oForm.Height < FormMinHeight Then oForm.Height = FormMinHeight
If oForm.Width < FormMinWidth Then oForm.Width = FormMinWidth
sww = oForm.ScaleWidth - ScrollWidth * ((2 And ScrolStat) / 2)
shh = oForm.ScaleHeight - ScrollWidth * (1 And ScrolStat)
If ww > sww Then
FormHScroll.Visible = True
ScrolStat = ScrolStat Or 1
Else
FormHScroll.Value = 0
FormHScroll.Visible = False
ScrolStat = Not (Not ScrolStat Or 1)
End If
If hh > shh Then
FormVScroll.Visible = True
ScrolStat = ScrolStat Or 2
Else
FormVScroll.Value = 0
FormVScroll.Visible = False
ScrolStat = Not (Not ScrolStat Or 2)
End If picScrol.Visible = (ScrolStat = 3)
If picScrol.Visible Then picScrol.Top = oForm.ScaleHeight - ScrollWidth
If picScrol.Visible Then picScrol.Left = oForm.ScaleWidth - ScrollWidth
If (ScrolStat And 1) Then
FormHScroll.Top = oForm.ScaleHeight - ScrollWidth * (1 And ScrolStat)
FormHScroll.Width = oForm.ScaleWidth - ScrollWidth * ((2 And ScrolStat) / 2)
FormHScroll.Max = (oForm.ScaleX(ww, oForm.ScaleMode, vbPixels) - oForm.ScaleX(sww, oForm.ScaleMode, vbPixels)) / ChangeUnitX
FormHScroll.Min = 0
End If
If (ScrolStat And 2) Then
FormVScroll.Height = oForm.ScaleHeight - ScrollWidth * (1 And ScrolStat)
FormVScroll.Left = oForm.ScaleWidth - ScrollWidth * ((2 And ScrolStat) / 2)
FormVScroll.Max = (oForm.ScaleY(hh, oForm.ScaleMode, vbPixels) - oForm.ScaleY(shh, oForm.ScaleMode, vbPixels)) / ChangeUnitY
FormVScroll.Min = 0
End If
End Sub'为了避免跟已存在的控件重名,用随机数决定滚卷条控件名称
Private Function GetControlName() As ControlName
Dim cname As ControlName
Dim I As Integer
Dim bolCtlExt As Boolean
On Error Resume Next
Randomize
For I = 1 To 20
cname.HsName = "tmp_form_hscroll_" & CStr(CInt(Rnd * 10000))
bolCtlExt = False
Err.Clear
bolCtlExt = oForm.Controls(cname.HsName).Name = cname.HsName
If Not bolCtlExt Then Exit For
If I = 20 Then Err.Raise 525, "FormScroll", "不能创建控件名称:" & cname.VsName
Next I
For I = 1 To 20
cname.VsName = "tmp_form_vscroll_" & CStr(CInt(Rnd * 1000))
bolCtlExt = False
bolCtlExt = oForm.Controls(cname.VsName).Name = cname.VsName
If Not bolCtlExt Then Exit For
If I = 20 Then Err.Raise 525, "FormScroll", "不能创建控件名称:" & cname.VsName
Next I
For I = 1 To 20
cname.PicName = "tmp_form_pic_" & CStr(CInt(Rnd * 1000))
bolCtlExt = False
bolCtlExt = oForm.Controls(cname.VsName).Name = cname.VsName
If Not bolCtlExt Then Exit For
If I = 20 Then Err.Raise 525, "FormScroll", "不能创建控件名称:" & cname.PicName
Next I
GetControlName = cname
End Function'移动窗体上的控件,实现滚卷功能
Private Sub FormScrol_Scroll()
Dim cont As Control
Dim xx As Single, yy As Single
xx = oForm.ScaleX(1, vbPixels, oForm.ScaleMode) * ChangeUnitX * (ohh - FormHScroll.Value)
yy = oForm.ScaleY(1, vbPixels, oForm.ScaleMode) * ChangeUnitY * (ovv - FormVScroll.Value)
ohh = FormHScroll.Value
ovv = FormVScroll.Value
For Each cont In FormControls
cont.Move cont.Left + xx, cont.Top + yy
Next
FormScrol_Disp
End Sub'初始化一些参数
Private Sub Class_Initialize()
BlockSize = 20
ChangeUnitX = 5
ChangeUnitY = 5
FormMinHeight = 2000
FormMinWidth = 2000
ScrollWidth = 250
End Sub'退出时释放对象变量
Private Sub Class_Terminate()
Set FormHScroll = Nothing
Set FormVScroll = Nothing
Set picScrol = Nothing
End Sub'用户点击水平滚卷条时,触发事件
Private Sub FormHScroll_Change()
FormScrol_Scroll
End Sub'用户点击垂直滚卷条时,触发事件
Private Sub FormVScroll_Change()
FormScrol_Scroll
End Sub'TargetForm属性用于设定目标Form
Public Property Get TargetForm() As Form
Set targeform = oForm
End PropertyPublic Property Set TargetForm(ByVal vNewValue As Form)
Set oForm = vNewValue
End Property
1、直接用容器控件Frame,控件放在容器上 Frame.Top=+/-2、多用几个用容器控件Frame,控件可放在各个容器上 通过Object.Zorder CONST 翻动!
frame
pbouter ' picturebox
pbinner ' picturebox
在frame 里面,pbouter外面放滚动条控件通过控制滚动条改变pbinner top,letf
去掉pbinner,pbouter的border效果非常好,我一直用它
你试试看,希望有帮助
当子窗体过大时
可以自动添加滚动条
不好意思,打错了。
那有没有PICTUREBOX里面放控件实现滚动的代码?
==================================================把我给你的代码,Form改成Picture,一样用