在VB 的FORM 里放了很多控件,运行时,界面比较小,但用户不能调整FORM大小,希望能通过滚动条显示其他的控件,怎样做?
不知道我说清楚了没有?
多谢。

解决方案 »

  1.   

    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long WS_BORDER:窗口带有一个薄边框 WS_DLGFRAME:带有一般对话框的风格,但没有标题栏 WS_CAPTION:窗口带有一个标题栏,经测试,实际上等于 (WS_BORDER Or WS_DLGFRAME) WS_SIZEBOX 和 WS_THICKFRAME:窗口带有一个可以调整窗口大小的边框(即VB里的Sizable,其他地方的边框均指不具调整大小功能的边框) WS_HSCROLL:窗口带有一个水平滚动条 WS_MAXIMIZEBOX:窗口带有最大化按钮,该窗口必须具有 WS_CAPTION 风格 WS_MINIMIZEBOX:窗口带有最小化按钮,该窗口必须具有 WS_CAPTION 风格 WS_SYSMENU:在窗口的标题栏上增加一个系统菜单,该窗口必须具有 WS_CAPTION 风格(即WS_BORDER和WS_DLGFRAME) WS_OVERLAPPED 和 WS_TILED:窗口是一个交迭式窗口。交迭式窗口带有一个标题栏和一个边框 WS_OVERLAPPEDWINDOW 和 WS_TILEDWINDOW:窗口是一个交迭式窗口,并且组合了 WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, 
      

  2.   

    我试一下会不会调用,如果大师(bydisplay)能指点一下最好。
    BAD FORM 不明白。
      

  3.   

    在VB 里怎样调用啊,大师,我试在From_Load 里调用这个函数,参数不知道怎样用。
    我这样用:SetWindowLong(Me, 0, WS_BORDER)  不行。
    多谢啦。
      

  4.   

    '添加模块
    Public Const SM_CXHSCROLL = 21
    Public Const GWL_STYLE = (-16)
    Public Const WS_HSCROLL = &H100000
    Public Const WS_VSCROLL = &H200000
    Public Const SB_BOTH = 3
    Public Const SB_HORZ = 0
    Public Const SB_VERT = 1
    '以下以SB_开头的是用户的滚动请求
    Public Const SB_LINEDOWN = 1
    Public Const SB_LINELEFT = 0
    Public Const SB_LINERIGHT = 1
    Public Const SB_LINEUP = 0
    Public Const SB_PAGERIGHT = 3
    Public Const SB_PAGELEFT = 2
    Public Const SB_PAGEDOWN = 3
    Public Const SB_PAGEUP = 2
    Public Const SB_ENDSCROLL = 8
    Public Const SB_THUMBPOSITION = 4
    Public Const SB_THUMBTRACK = 5
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_HSCROLL = &H114
    Public Const WM_VSCROLL = &H115
    Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
    Declare Function ShowScrollBar Lib "user32" (ByVal hWnd As Long, ByVal wBar As Long, ByVal bShow As Long) As Long
    Declare Function SetScrollPos Lib "user32" (ByVal hWnd As Long, ByVal nBar As Long, ByVal nPos As Long, ByVal bRedraw As Long) As Long
    Declare Function SetScrollRange Lib "user32" (ByVal hWnd As Long, ByVal nBar As Long, ByVal nMinPos As Long, ByVal nMaxPos As Long, ByVal bRedraw As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public preWndProc As Long
    Public xMin As Integer, xMax As Integer
    Public yMin As Integer, yMax As Integer
    Public xPos As Integer, yPos As Integer
    Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
    On Error Resume Next
    Dim xInc As Integer, yInc As Integer
    Select Case uMsg
    Case WM_VSCROLL '垂直滚动条消息
    Select Case LoWord(wParam)
    Case SB_LINEUP, SB_LINEDOWN
    If LoWord(wParam) Then
    yInc = 1
    Else
    yInc = -1
    End If
    Case SB_PAGEUP, SB_PAGEDOWN
    If LoWord(wParam) = SB_PAGEUP Then
    yInc = -10
    Else
    yInc = 10
    End If
    Case SB_THUMBTRACK
    yInc = HiWord(wParam) - yPos
    End Select
    yPos = yPos + yInc
    If yPos < yMin Then yPos = yMin
    If yPos > yMax Then yPos = yMax
    SetScrollPos hWnd, SB_VERT, yPos, True
    Form1.Label1 = yPos
    Case WM_HSCROLL '垂直水平条消息
    Select Case LoWord(wParam)
    Case SB_LINELEFT, SB_LINERIGHT
    If LoWord(wParam) Then
    xInc = 1
    Else
    xInc = -1
    End If
    Case SB_PAGELEFT, SB_PAGERIGHT
    If LoWord(wParam) = SB_PAGELEFT Then
    xInc = -10
    Else
    xInc = 10
    End If
    Case SB_THUMBTRACK
    xInc = HiWord(wParam) - xPos
    End Select
    xPos = xPos + xInc
    If xPos < xMin Then xPos = xMin
    If xPos > xMax Then xPos = xMax
    SetScrollPos hWnd, SB_HORZ, xPos, True
    Form1.Label2 = xPos
    End Select
    WindowProc = CallWindowProc(preWndProc, hWnd, uMsg, wParam, lParam)
    End Function
    Public Sub SubClass(frm As Form)
    preWndProc = SetWindowLong(frm.hWnd, GWL_WNDPROC, AddressOf WindowProc)
    End Sub
    Public Sub UnSubClass(frm As Form)
    Call SetWindowLong(frm.hWnd, GWL_WNDPROC, preWndProc)
    End Sub
    'The function below is much useful in API development.
    Private Function LoWord(num As Long) As Integer
    LoWord = num Mod &H10000
    End Function
    Private Function HiWord(num As Long) As Integer
    HiWord = (num And &HFFFF0000) / &H10000
    End Function
    先在窗口上放两个Lable,两个Botton.
    '1.窗口风格的设置
    '在窗口声明部分加入
    Dim HVisible as Boolean,VVisible as Boolean
    Private Sub Form_Load()
    Dim OldStyle As Long
    Dim hsWidth As Integer
    '保存旧风格
    OldStyle = SetWindowLong(hWnd, GWL_STYLE, 0)
    '设置新风格
    Call SetWindowLong(hWnd, GWL_STYLE, OldStyle Or WS_VSCROLL Or WS_HSCROLL)
    Command1.Caption = "隐藏垂直滚动条"
    Command2.Caption = "隐藏水平滚动条"
    Label1 = "垂直滚动条的值"
    Label2 = "水平滚动条的值"
    '得到水平滚动条的宽度
    hsWidth = GetSystemMetrics(SM_CXVHSCROLL)
    '改变窗口宽度与高度
    Width = Width + hsWidth
    Height = Height + hsHeight
    VVisible = True
    HVisible = True
    '怎么样,滚动条显示出来了没有?没有?那么是我眼花了?@_@
    '2.滚动范围的设置
    yMin = 0: yMax = 100
    xMin = 0: xMax = 100
    SetScrollRange hWnd, SB_HORZ, xMin, xMax, True
    SetScrollRange hWnd, SB_VERT, yMin, yMax, True
    '建立子类窗口
    SubClass Me
    End Sub'End Of Form_Load
      

  5.   

    真是多谢啦,滚动条是出来啦,但还没解决我的问题。
    设计时我在VB FORM 里画了十个文本框,运行时FORM 较小,结果下面的文本框就显示不出来,我希望滚动条滚动后就可以显示下面的文本框。
      

  6.   

    动态调整文本框的位置。你可以先做好frame,然后调整滚动条的时候你只要调整frame.top就可以了。