Prerequisites |
None. |
|
I
once had occasion to require a textbox that the user could size dynamically at runtime. By experimenting with the Windows APIs GetWindowLong,
SetWindowLong, and SetWindowPos, I was able to create a textbox which, on command, had its fixed 3d border change into a sizeable border. |
|
BAS
Module Code |
|
Place the following code into the general declarations
area of a bas module: |
|
Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Distribution: You can freely use this code in your own
' applications, but you may not reproduce
' or publish this code on any web site,
' online service, or distribute as source
' on any media without express permission.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'windows constants
Public Const SWP_DRAWFRAME As Long = &H20
Public Const SWP_NOMOVE As Long = &H2
Public Const SWP_NOSIZE As Long = &H1
Public Const SWP_NOZORDER As Long = &H4
Public Const SWP_FLAGS As Long = SWP_NOZORDER Or SWP_NOSIZE Or _
SWP_NOMOVE Or SWP_DRAWFRAME
Public Const GWL_STYLE As Long = (-16)
Public Const WS_THICKFRAME As Long = &H40000
Public Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long |
|
Form
Code |
|
To a form add a text box (Text1), a command button
(Command1), 2 menu items (mnuSize & mnuRestore), and 2 labels (Label1 & Label2). Add the following code to the form: |
|
Option Explicit
'variables initially set in Form_Load,
'used to reset default values
Dim initBoxStyle As Long
Dim initLeft As Integer
Dim initTop As Integer
Dim initWidth As Integer
Dim initHeight As Integer
Private Sub Form_Load()
'position the form
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
'set up a few variables needed later
initBoxStyle = GetWindowLong(Text1.hwnd, GWL_STYLE)
initLeft = Text1.Left
initTop = Text1.Top
initWidth = Text1.Width
initHeight = Text1.Height
'make sure the defaults are set
SetControlStyle initBoxStyle, Text1
Label1.Caption = "Text Width : " & Text1.Width
Label2.Caption = "Text Height : " & Text1.Height
End Sub
Private Sub Form_Unload(Cancel As Integer)
'restore the control to a normal textbox
SetControlStyle initBoxStyle, Text1
End Sub
Private Sub Form_Click()
'restore the control to a normal textbox
SetControlStyle initBoxStyle, Text1
Label1.Caption = "Text Width : " & Text1.Width
Label2.Caption = "Text Height : " & Text1.Height
End Sub
Private Sub mnuSize_Click()
Dim style As Long
'get the current style attributes for the textbox
style = GetWindowLong(Text1.hwnd, GWL_STYLE)
'modify the style to show the sizing frame
style = style Or WS_THICKFRAME
'set the control to the chosen style
SetControlStyle style, Text1
End Sub
Private Sub mnuRestore_Click()
'restore the control to a normal textbox
SetControlStyle initBoxStyle, Text1
End Sub
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub SetControlStyle(style, X As Control)
If style Then
Call SetWindowLong(X.hwnd, GWL_STYLE, style)
Call SetWindowPos(X.hwnd, Form1.hwnd, 0, 0, 0, 0, SWP_FLAGS)
End If
End Sub |
|
Comments |
Save the app & run. Clicking the 'Size' menu item will
cause the textbox border to change into a sizeable frame. After resizing, clicking the form or selecting 'Restore' will return the textbox to
the normal textbox style at the selected size and position.
This same technique can also be successfully applied to lists, listviews, treeviews, picture boxes ... pretty well most VB controls. |
|