Newsgroup: it.comp.lang.visual-basic
Titolo: [?] esiste un evento legato allo spostamento di una finestra?

come da oggetto
Grazie
Massimiliano

Ciao.
Io avevo adattato un programmino per eseguire il subclass di una finestra e
interecettare alcuni eventi che non vengono gestiti da VB.
Per provarlo puoi creare un form (chiamalo Form1) con un ListBox (chiamalo
lstMessages) e impostare il codice che segue:
Private Sub Form_Load()
    StartSubclassing Me.hWnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
    StopSubclassing
End Sub
Private Sub Form_Resize()
    On Error Resume Next
    With lstMessages
        .Move .Left, .Top, ScaleWidth - .Left * 2, ScaleHeight - .Top - 200
    End With
End Sub
Aggiungi poi un modulo Bas e incolla questo:
Option Explicit
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
(ByVal hWnd As Long, ByVal ndx As Long, ByVal newValue As Long) As Long
Private 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
' Questa costante è utilizzata per indicare che si vuole modificare
l'indirizzo
' della WindowProcedure originale
Const GWL_WNDPROC = -4
' Costante che identificano alcuni messaggi:
Const WM_MOVE = &H3  ' Movimento
Const WM_SIZING = &H214  ' Ridimensionamento
Const WM_ACTIVATEAPP = &H1C  ' Attivazione
' saveHWnd contiene l'handle della finestra subclassata
Dim saveHWnd As Long
' oldProcAddr contiene l'indirizzo della WindowProcedure originale
Dim oldProcAddr As Long
Sub StartSubclassing(ByVal hWnd As Long)
' Inizio il subclass della finestra
' Memorizzo l'handle della finestra e l'indirizzo della WindowProcedure
originale
' (mi servirà per disattivare il subclass)
    saveHWnd = hWnd
    oldProcAddr = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
Sub StopSubclassing()
' Disattivo il subclass della finestra, passando l'indirizzo della
WindowProcedure originale
    SetWindowLong saveHWnd, GWL_WNDPROC, oldProcAddr
End Sub
Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
    ' Invio il messaggio alla WindowProcedure originale e memorizzo nel
    ' valore di ritorno della funzione, il valore tornato.
    WndProc = CallWindowProc(oldProcAddr, hWnd, uMsg, wParam, lParam)
    ' Intercetto alcuni messaggi (movimento, ridimensionamento e
attivazione/disattivazione)
    ' Aggiungo la descrizione alla lista nel form
    Select Case uMsg
        Case WM_MOVE
            NotifyMsg "Finestra Spostata"
        Case WM_SIZING
            NotifyMsg "Finestra Ridimensionata"
        Case WM_ACTIVATEAPP
            If wParam Then
                NotifyMsg "Finestra Attivata"
            Else
                NotifyMsg "Finestra Disattivata"
            End If
    End Select
End Function
Sub NotifyMsg(text As String)
' Aggiungo alla listbox il testo passato a parametro e attivo l'ultima riga
    Form1.lstMessages.AddItem text
    Form1.lstMessages.ListIndex = Form1.lstMessages.ListCount - 1
End Sub
Spero ti sia di aiuto.
Ciao.
Skysurfer

Sinceramente non ricordo se esiste un evento legato al movimento della
finestra,
comunque potresti simularlo con l'evento mouse_move verificando la
variazione
dei form.left e form.top
Spero di essere stato utile
Raffaele


come da oggetto
come da firma
Ciao,
Moreno
#sirri#@#
morenosoft.com#
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.msvbsite.net
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.it-lang-vb.net
---------------------------------------------------------------------------

Grazie a tutti adesso provo
Massimiliano