Venky's World

     

    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