因为控件很多,在窗体上一页显示不下,所以要能够实现自由滚动,要求如下:
1,要在窗体上面放置更多的其他的控件;
2,当放置的控件数量超过控件的大小时,控件要自动出现滚动条(理论上此控件可以加载无限个其他控件)。

解决方案 »

  1.   

    加滚动条控件,在滚动条控件事件里调整控件的left top属性
      

  2.   

    比較麻煩一個picture,橫豎滾動條各一。
    所有的控件放picture上,然後用滾動條控制它的TOP和LEFT。
      

  3.   

    '新建一个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.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
      

  4.   

    加一个控件容器,把所有控件放在这个容器中,然后把这个容器放在Pictuer控件中,通过写Pictuer的滚动条事件改变容器的Top属性。
      

  5.   


    1、直接用容器控件Frame,控件放在容器上   Frame.Top=+/-2、多用几个用容器控件Frame,控件可放在各个容器上 通过Object.Zorder CONST 翻动!
      

  6.   

    为了美观一般放三个容器
    frame
     pbouter ' picturebox  
     pbinner   ' picturebox
    在frame 里面,pbouter外面放滚动条控件通过控制滚动条改变pbinner top,letf
    去掉pbinner,pbouter的border效果非常好,我一直用它
    你试试看,希望有帮助
      

  7.   

    fuxc(Michael(继续迷茫)) 给的模块真好用~~
      

  8.   

    一个PICTURE,两个滚动条,不超过5行代码,足以
      

  9.   

    我就是PICTUREBOX加滚动条,而且基本上大家都是这么做的吧。
      

  10.   

    感觉最简单的方法是用MCI窗体
    当子窗体过大时
    可以自动添加滚动条
      

  11.   

    MDI窗体
    不好意思,打错了。
      

  12.   

    那有没有PICTUREBOX里面放控件实现滚动的代码?
      

  13.   

    把所有控件装在PICTURE容器中,设置一个全局变量高度,当高度超过时,则显示滚动条!
      

  14.   

    zhj52288888(狐帆) ( ) 信誉:92  2006-4-19 14:25:01  得分: 0  
     
     
       
    那有没有PICTUREBOX里面放控件实现滚动的代码?  
     
    ==================================================把我给你的代码,Form改成Picture,一样用