Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Event μετακίνησης φόρμας στην οθόνη

Îåêßíçóå áðü ôï ìÝëïò Xlomo_prosopo. Τελευταία δημοσίευση από το μέλος Xlomo_prosopo στις 17-10-2006, 13:36. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-10-2006, 19:29 18609

    Event μετακίνησης φόρμας στην οθόνη

    Υπάρχει κάποιο Event που να μπορώ να γράψω κώδικα στην περίπτωση που ο χρήστης μετακινήσει και  αλλάξει τη θέση μιας φόρμας πάνω στην οθόνη, όπως πχ. το event resize που συμβαίνει όταν αλλάζει το μέγεθος της φόρμας.
  •  15-10-2006, 20:29 18611 σε απάντηση της 18609

    Απ: Event μετακίνησης φόρμας στην οθόνη

    Κάποιο 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.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  16-10-2006, 17:51 18643 σε απάντηση της 18609

    Απ: Event μετακίνησης φόρμας στην οθόνη

    Αυτό μου κάνει ευχαριστώ! Και από περιέργεια υπάρχει κάποια καλή σελίδα στο Internet που να λέει τι άλλα μυνήματα μπορεί να φτάσουν στη φόρμα ?
  •  16-10-2006, 18:01 18644 σε απάντηση της 18643

    Απ: Event μετακίνησης φόρμας στην οθόνη

    Δες αυτό: http://www.allapi.net/ Δεν είναι ακριβώς σελίδα που να μηνύματα, αλλά σου δείχνει πως μπορείς να κάνεις με τη VB6 ένα σωρό πράγματα που δεν τα κάνει η VB out of the box,  χρησιμοποιώντας το Windows API, τον ίδιο μηχανισμό που χρησιμοποίησε ο Γιώργος για τη λύση που σου πρότεινε. Όταν έγραφα VB6, σύχναζα πολύ σε αυτό το site Smile


    Vir prudens non contra ventum mingit
  •  17-10-2006, 13:36 18698 σε απάντηση της 18609

    Απ: Event μετακίνησης φόρμας στην οθόνη

    Θα του ρίξω μια ( μάλον παραπάνω ) ματιά, Ευχαριστώ.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems