Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Intercettare fine spostamento form

Ciao,
sembra una cazzata, ma non riesco ad intercettare, con uno degli eventi
nativi dell'oggetto Form, quando il mouse viene rilasciato, al termine dello
spostamento della form mediante trascinamento.
L'evento "MouseUP", che mi sembrava il più adatto, si scatena solo se si era
cliccato su un qualsiasi punto della form, ma non sulla barra del titolo,
che mi serve per lo spostamento..
Mi date una dritta ?
Paolo

 ha scritto nel messaggio news:451a6dc3$1...@newsgate.x-privat.org...

Ciao,
ti do' una dritta un po' storta...
devi fare il subclassing del form e intercettare il messaggio (leggi evento)
WM_MOVE
--
That's All Folks!
http://salclem2.altervista.org/

 WM_MOVE
Ok, avevo realizzato che mi sarebbe servito il subclassing, e stavo facendo
delle prove con il subclassing.
A me serve capire quando il tasto (sinistro) del mouse viene rilasciato a
seguito di uno spostamento, ma non lo spostamento stesso. In pratica ho
trovato il messaggio WM_LBUTTONUP ma non funziona se il mouse si trova sulla
barra del titolo.
A questo punto che messaggio potrei usare ?

 seguito di uno spostamento, ma non lo spostamento stesso.
In realtà WM_MOVE che mi hai suggerito va bene quasi al 100%... Non funge
solo se clicco sulla barra del titolo e rilascio senza aver spostato la
form... A me servirebbe anche quello.

 ha scritto nel messaggio news:451a7883$1...@newsgate.x-privat.org...

prova con questo: WM_NCLBUTTONUP

> prova con questo: WM_NCLBUTTONUP
Se WM_NCLBUTTONUP As Integer = &HA0 allora si scatena quando passo sopra
alla barra del titolo senza avere cliccato... Se invece è &HA2, allora non
funge.

 ha scritto nel messaggio news:451a8856$1...@newsgate.x-privat.org...

Ti posto un po' di documentazione,
comunque la costante e' WM_NCLBUTTONUP As Long = &HA2&
--------------------------------------------------------------------------
The WM_NCLBUTTONUP message is posted when the user releases the left mouse button while the cursor is within the nonclient area of a
window. This message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not
posted.
WM_NCLBUTTONUP
nHittest = (INT) wParam;    // hit-test value
pts = MAKEPOINTS(lParam);   // mouse-cursor coordinates
 Parameters
  nHittest
  Value of wParam. Specifies the hit-test value returned by the DefWindowProc function as a result of processing the WM_NCHITTEST
message. For a list of hit-test values, see WM_NCHITTEST.
  pts
  Value of lParam. Specifies aPOINTS structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to
the upper-left corner of the screen.
Return Values
If an application processes this message, it should return zero.
Default Action
The DefWindowProc function tests the given point to find out the location of the cursor and performs the appropriate action. If
appropriate, DefWindowProc sends the WM_SYSCOMMAND message to the window.
Remarks
An application can use the MAKEPOINTS macro to convert the lParam parameter to a POINTS structure.
If it is appropriate to do so, the system sends the WM_SYSCOMMAND message to the window.

 ha scritto nel messaggio news:451a8856$1...@newsgate.x-privat.org...

era ovvio, si tratta di WM_NCMOUSEMOVE

 comunque la costante e' WM_NCLBUTTONUP As Long = &HA2&
ti ringrazio per l'aiuto. Ho fatto un po' di prove: funziona solo se la
finestra č massimizzata. Clicco sulla batta del titolo, rilascio il bottone
del mouse e scatta l'evento.
Se non č massimizzata non va.


dovrebbe andare, posta il codice che forse troviamo lo sbaglio
ciao


 dovrebbe andare, posta il codice che forse troviamo lo sbaglio
E' il progetto di esempio di Moreno Sirri, perso dal suo sito, e modificato
per gestire il messaggio WM_NCLBUTTONUP anzichè WM_MOVING...
Eccolo:
---------- Module1.bas ------------
Public Const WM_NCLBUTTONUP As Long = &HA2&
Public Const GWL_WNDPROC = (-4)
Public 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 Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
   (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As
Long
Public lProcOld As Long
Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long
    If uMsg = WM_NCLBUTTONUP Then
       MsgBox "ButtonUP"
    End If
    WindowProc = CallWindowProc(lProcOld, hWnd, uMsg, wParam, lParam)
End Function
---------- Form1 ------------
Private Sub Form_Load()
    lProcOld = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    SetWindowLong Me.hWnd, GWL_WNDPROC, lProcOld
End Sub


a quanto pare e' un bug di Windows, leggi questo:
http://www.codeguru.com/cpp/misc/misc/windowsmessaging/article.php/c3885/

 
http://www.codeguru.com/cpp/misc/misc/windowsmessaging/article.php/c3885/
Aha!
Mi pareva che ci fosse qualcosa di strano! Certo che tutto sto casino...
Grazie mille!
Paolo