Create controls at runtime -II
In this snippet/article we will learn how to react to events occuring in
controls created at runtime. For Ex How do we react to a click event of a
command button which was created at runtime. .We will use a technique called
as Subclassing to do this. Before we start doing this make sure you have
read/viewed the earlier snippet/article on how to create the controls from
here.
Put the following declarations in a .bas module
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA"
(ByVal hWnd As Long, ByVal nindex As Long, ByVal dwnewlong As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA"
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal
wParam As Long, lParam As Long) As Long
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const GWL_WNDPROC = (-4)
Global oldWndProc As Long
The Functions SetWindowLong and CallWindowProc are used to subclass the
control.
Put the following piece of code in the same event as that in which you are
creating the control i.e .If you are creating the control in the form load
event then put the following piece of code in that event.
oldWndProc = SetWindowLong(cmdInput.hWnd, GWL_WNDPROC, AddressOf newWndProc)
Here cmdInput is the command button which was created at runtime,newWndProc is
the function which is going to handle the messages/events .
Next we write the public function in a .bas module which would process all the
messages/events of the control.
Here is the function
Public Function newWndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal
wParam As Long, lParam As Long) As Long
If uMsg = WM_LBUTTONDOWN Then
Form1.Text1.Text = "ok"
End If
newWndProc = CallWindowProc(oldWndProc, hWnd, uMsg, wParam, lParam)
End Function
What this function does is when the command button is clicked it prints "ok"
into the textbox on form1.
You can modify the message i.e WM_LBUTTONDOWN to any suitable message that you
wish to intercept.
Download a simple Demo application from
here