HOWTO: Scroll VB Text Box Programmatically and Specify Lines

Last reviewed: September 30, 1997
Article ID: Q147887
The information in this article applies to:
  • Standard, Professional, and Enterprise Editions of Microsoft Visual Basic, 16-bit and 32-bit, for Windows, version 4.0 --------------------------------------------------------------------------

SUMMARY

By making a call to the Windows API function SendMessage, you can scroll text a specified number of lines or columns within a Microsoft Visual Basic for Windows text box. By using the SendMessage function, you can also scroll text programmatically, without user interaction. This technique extends Visual Basic for Windows' scrolling functionality beyond the built-in statements and methods. The sample program below shows how to scroll text vertically and horizontally a specified number of lines.

MORE INFORMATION

Visual Basic for Windows itself does not offer a statement for scrolling text a specified number of lines vertically within a text box. You can scroll text vertically by actively clicking the vertical scroll bar for the text box at run time; however, you do not have any control over how many lines are scrolled for each click of the scroll bar. Text always scrolls one line per click of the scroll bar. Furthermore, no built-in Visual Basic for Windows method can scroll text without user interaction. To work around these limitations, you can call the Windows API function SendMessage, as explained below.

Step-by-Step Example

To scroll the text a specified number of lines within a text box requires a call to the Windows API function SendMessage using the constant EM_LINESCROLL. You can invoke the SendMessage function from Visual Basic for Windows as follows:

r& = SendMessage& (hWnd&, EM_LINESCROLL, wParam&, lParam&)

   hWnd&    The window handle of the text box.
   wParam&  Parameter not used.
   lParam&  The low-order 2 bytes specify the number of vertical lines to
            scroll. The high-order 2 bytes specify the number of horizontal
            columns to scroll. A positive value for lParam& causes text to
            scroll upward or to the left. A negative value causes text to
            scroll downward or to the right.
   r&       Indicates the number of lines actually scrolled.

The SendMessage API function requires the window handle (hWnd& above) of the text box. To get the window handle of the text box, use the hWnd property of the text box. For instance, if your text box's name is text1, text1.hWnd returns the window handle of that text box. Calling SendMessage to scroll text vertically does not require a vertical scroll bar, but the length of text within the text box should exceed the text box height.

Below are the steps necessary to create a text box that scrolls five vertical lines each time you click the command button labeled "Vertical:"

  1. On the File menu, click New Project (press ALT, F, N).

  2. On the Visual Basic Insert menu, click module to insert a code module.

  3. Add the following API declaration to the General Declarations section of Module1. Note that SetFocus is aliased as PutFocus because there already exists a SetFocus method within Visual Basic for Windows:

          #If Win32 Then
          Declare Function PutFocus Lib "user32" Alias "SetFocus" (ByVal _
    
             hwnd As Long) As Long
          Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
             (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As _
             Integer, ByVal lParam As Long) As Long
          #Else
          Declare Function PutFocus% Lib "user" Alias "SetFocus" (ByVal hWd%)
          Declare Function SendMessage& Lib "user" (ByVal hWd%, ByVal wMsg%, _
             ByVal wParam%, ByVal lParam&)
          #End If
    
    

  4. Create a text box called Text1 on Form1. Set the MultiLine property to True and the ScrollBars property to Horizontal (1).

  5. Create a CommandButton called Command1 and change the Caption to "Vertical."

  6. In the General Declarations section of Form1, create a procedure to initialize some text in the text box as follows:

           Sub InitializeTextBox ()
           Text1.Text = ""
           For i% = 1 To 50
           Text1.Text = Text1.Text + "This is line " + Str$(i%)
           ' Add 15 words to a line of text.
           For j% = 1 to 10
           Text1.Text = Text1.Text + " Word "+ Str$(j%)
           Next j%
           ' Force a carriage return (CR) and linefeed (LF).
           Text1.Text = Text1.Text + Chr$(13) + Chr$(10)
           x% = DoEvents()
           Next i%
           End Sub
    
    

  7. Add the following code to the load event procedure of Form1:

           Sub Form_Load ()
           Call InitializeTextBox
           End Sub
    
    

  8. Create the actual scroll procedure within the General Declarations section of Form1 as follows:

           Function ScrollText&(TextBox As Control, vLines As Integer)
           #If Win32 Then
           Dim Success As Long
           Dim SavedWnd As Long
           Dim R As Long
           Const EM_LINESCROLL = &HB6
           #Else
           Dim Success As Integer
           Dim SavedWnd As Integer
           Dim R As Integer
           Const EM_LINESCROLL = &H406
           #End If
           ' Get the window handle of the control that currently has the
           '  focus, Command1 or Command2.
           SavedWnd = Screen.ActiveControl.hwnd
           Lines& = vLines
           ' Set the focus to the passed control (text control).
           TextBox.SetFocus
           ' Scroll the lines.
           Success = SendMessage(TextBox.hwnd, EM_LINESCROLL, 0, Lines&)
           ' Restore the focus to the original control, Command1 or
           '  Command2.
           R = PutFocus(SavedWnd)
           ' Return the number of lines actually scrolled.
           ScrollText& = Success
           End Function
    

  9. Add the following code to the click event procedure of Command1 labeled "Vertical:"

           Sub Command1_Click ()
           ' Scroll text 5 vertical lines upward.
           Num& = ScrollText&(Text1, 5)
           End Sub
    
    

  10. Run the program. Click the CommandButton to scroll the text five lines

        at a time.
    
Keywords          : APrgWindow PrgCtrlsStd VB4ALL VB4WIN vbwin GnrlVb kbprg kbfasttip
Technology        : kbvba
Version           : WINDOWS:4.0
Platform          : WINDOWS
Issue type        : kbhowto


================================================================================


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: September 30, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.