Browse DevX
Sign up for e-mail newsletters from DevX

Tip of the Day
Language: VB4/32,VB5,VB6
Expertise: Intermediate
Mar 31, 2001



Building the Right Environment to Support AI, Machine Learning and Deep Learning

Set tab stop positions for a multiline TextBox control

By default, multiline TextBox controls insert a tab stop position every 8 characters; in other words, if you press the Ctrl+Tab key while the focus is inside a multiline TextBox control, the caret advances to position 8,16,24, etc. (If the TextBox is the only control on the form that can receive the focus in that moment, you can also advance to the next tab stop with the Tab key.)

By sending the control a EM_SETTABSTOPS message, you can set individual tab stops at desired positions. You do so by loading an array of Longs with the position of individual tab stops, expressed in dialog units - where each dialog unit is 1/4 of the average character width. Then you pass the array to the SendMessage function, specifying the number of elements in wParam and the first element of the array in lParam. Here's an example:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal _
    hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
    lParam As Any) As Long

' Set tab stops at character position 5, 10, and 20
Dim tabs(2) As Long
tabs(0) = 5 * 4
tabs(1) = 10 * 4
tabs(2) = 20 * 4
SendMessage Text1.hWnd, EM_SETTABSTOPS, 3, tabs(0)
The following routine encapsulates this call for you:

' Set tab stops. Each element of the array is expressed in dialog units,
' where each dialog unit is 1/4 of the average character width.

Sub TextBoxSetTabStops(tb As TextBox, tabStops() As Long)
    Dim numEls As Long
    numEls = UBound(tabStops) - LBound(tabStops) + 1
    SendMessage tb.hwnd, EM_SETTABSTOPS, numEls, tabStops(LBound(tabStops))
End Sub
The simplest case is when all the tab stops have the same distance, in which case you can use the following routine:

' Set the tab stop distance, expressed in dialog units.

Sub TextBoxSetTabStopDistance(tb As TextBox, ByVal distance As Long)
    SendMessage tb.hwnd, EM_SETTABSTOPS, 1, distance
End Sub
Francesco Balena
Comment and Contribute






(Maximum characters: 1200). You have 1200 characters left.



Thanks for your registration, follow us on our social networks to keep up-to-date