Results 1 to 4 of 4

Thread: What is Sub Classing exactly?

  1. #1

    Thread Starter
    Member
    Join Date
    Aug 1999
    Location
    Bahrain
    Posts
    41
    What is Sub Classing exactly?
    And where can I get good resource for Sub Classing?

  2. #2
    Monday Morning Lunatic parksie's Avatar
    Join Date
    Mar 2000
    Location
    Mashin' on the motorway
    Posts
    8,169
    First, a quick intro as to how Windows programs process events. Every window (you may have more than one window per process/thread) has an associated window procedure, which is a function that recieves all messages from the system. Visual Basic creates its own hidden function, and calls your event handlers from it.

    Sub-classing is where you replace a window's window procedure with your own, then once you've used the message you forward it to the original function. Inside your program you can use it to catch unsupported messages. Outside of your program you need an external DLL to alter windows not belonging to your program.
    I refuse to tie my hands behind my back and hear somebody say "Bend Over, Boy, Because You Have It Coming To You".
    -- Linus Torvalds

  3. #3
    Frenzied Member Vlatko's Avatar
    Join Date
    Aug 2000
    Location
    Skopje, Macedonia
    Posts
    1,409
    Simple example on subclassing:
    Code:
    'Create a new project, add a module to it
    'Add a command button to Form1
    'In the form
    Private Sub Form_Load()
        'Subclass this form
        HookForm Me
        'Register this form as a Clipboardviewer
        SetClipboardViewer Me.hwnd
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        'Unhook the form
        UnHookForm Me
    End Sub
    Private Sub Command1_Click()
        'Change the clipboard
        Clipboard.Clear
        Clipboard.SetText "Hello !"
    End Sub
    
    'In a module
    'These routines are explained in our subclassing tutorial.
    'http://www.allapi.net/vbtutor/subclass.htm
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Declare Function SetClipboardViewer Lib "user32" (ByVal hwnd As Long) As Long
    Public Const WM_DRAWCLIPBOARD = &H308
    Public Const GWL_WNDPROC = (-4)
    Dim PrevProc As Long
    Public Sub HookForm(F As Form)
        PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    End Sub
    Public Sub UnHookForm(F As Form)
        SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
    End Sub
    Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
        If uMsg = WM_DRAWCLIPBOARD Then
            MsgBox "Clipboard changed ..."
        End If
    End Function
    I am become death, the destroyer of worlds.
    mail:[email protected]

    • Visual Basic 6.0 & .NET
    • Visual C++ 6.0 & .NET
    • ASP
    • LISP
    • PROLOG
    • C
    • Pascal

  4. #4
    Megatron
    Guest
    It's useful because you can intercept messages before VB has a chance to. Here's a simple example.

    Add to a Module.
    Code:
    Declare Function SetWindowLong& Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long)
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Const GWL_WNDPROC = (-4)
    Const WM_LBUTTONDOWN = &H201
    
    Global WndProcOld As Long
    
    Public Function WindProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If wMsg = WM_LBUTTONDOWN Then Form1.Print "(Subclassed) mouse pressed"
        WindProc = CallWindowProc(WndProcOld&, hwnd&, wMsg&, wParam&, lParam&)
    End Function
    
    Sub SubClassWnd(hwnd As Long)
        WndProcOld& = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindProc)
    End Sub
    
    Sub UnSubclassWnd(hwnd As Long)
        SetWindowLong hwnd, GWL_WNDPROC, WndProcOld&
        WndProcOld& = 0
    End Sub
    Add to a Form
    Code:
    Private Sub Form_Load()
        SubClassWnd hwnd
    End Sub
    
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Print "(VB) Mouse pressed"
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
        UnSubclassWnd hwnd
    End Sub
    Try pressing the left button. As you can see, the code in the subclassed routine fires first.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width