Κάποιο event δεν υπάρχει - ουδέν κρυπτόν στο dropdown των events της φόρμας της VB6.
Από εκεί και πέρα, σίγουρα ο μηχανισμός των windows επιτρέπει να κάνεις κάτι τέτοιο. Μπορείς να παρακολουθήσεις τα μηνύματα που φτάνουν στην φόρμα και όταν φτάσει αυτό της μετακίνησής της (WM_MOVE) να εκτελέσεις κάποια ρουτίνα - κάτι ισοδύναμο του event που φτάνει στην φόρμα.
Μια τέτοια διαδικασία είναι γνωστή σαν subclassing. Μπορεί κάποιος να δημιουργήσει ένα hook στην αρχή εκτέλεσης του κώδικα της φόρμας και στην συνέχεια να παρακολουθεί τα events που φτάνουν στην φόρμα και να πράττει ανάλογα. Το κακό είναι ότι όταν υπάρχει μια τέτοια διαδικασία σε εξέλιξη, το περιβάλλον της VB6 καταλήγει με ένα crash, όταν σταματήσει ο προγραμματιστής την ροή του προγράμματος χωρίς να τρέξει τον κώδικα που θα καταργεί το hook που έγινε στην αρχή.
Αρκετή θεωρία την πράξη τώρα:
Έστω ότι έχουμε τον παρακάτω κώδικα στην form, Form1
Option Explicit
Private Sub Form_Load()
Hook_Start Me.hWnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
Hook_End Me.hWnd
End Sub
Friend Sub Me_Move(ByVal xPos As Long, ByVal yPos As Long)
Me.Caption = "x=" & xPos & "; y=" & yPos
End Sub
και το module Module1:
Option Explicit
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
Public Const GWL_WNDPROC = (-4)
Private Const WM_MOVE = &H3
Dim m_PrevProc As Long
Public Sub Hook_Start(ByVal hWnd As Long)
m_PrevProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf CallbackProcedure)
End Sub
Public Sub Hook_End(ByVal hWnd As Long)
SetWindowLong hWnd, GWL_WNDPROC, m_PrevProc
End Sub
Private Function CallbackProcedure(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
CallbackProcedure = CallWindowProc(m_PrevProc, hWnd, uMsg, wParam, lParam)
If uMsg = WM_MOVE Then
Form1.Me_Move lParam And &HFFFF&, lParam \ &HFFFF&
End If
End Function
George J.