Newsgroup: it.comp.lang.visual-basic
Titolo: impedire al mouse di uscire da un picture

ciao
mi sono creato un piccolo controllo per il ridimensionamento e lo
spostamento dei controlli a run time.
ho trovato del codice che usa delle api per lo spostamento.
questo codice va bene perche' mi sposta i controlli solamente nel perimetro
dei conteitori (ad esempio picturebox) che li contengono, ma ha un piccolo
difetto, ho diverse image sul form, e quando sposto un controllo, mi si
refresh tutte e mi si blocca per qualche secondo.
ho usato allora il vbdrag .......  ma il mouse mi si sposta oltre il
contenitore e prende le cordinate del form , di conseguenza lo spostamento
del controllo non e' corretto.
mi sapreste dire come posso impedire al mouse di andare oltre il
contenitore?
grazie mille
ciao ilario

contenitore?
ClipCursor(), da usare con attenzione.
-- 
ciao, hal

ciao hal
ti posto il codice che ho trovato nel quale compare quella che mi hai
suggerito.
Private Declare Function ClipCursor Lib "user32" (lpRect As Rect) As Long
Private Declare Function ClipCursorByNum Lib "user32" Alias "ClipCursor"
(ByVal _
        lpRect As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As PointApi) As
Long
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long)
As _
        Integer
Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, _
        lpRect As Rect) As Long
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, _
        lpPoint As PointApi) As Long
Private Declare Function InvalidateRect Lib "user32" (ByVal hwnd As Long, _
        lpRect As Rect, ByVal bErase As Long) As Long
Private Declare Function InvalidateRectByNum Lib "user32" Alias _
        "InvalidateRect" (ByVal hwnd As Long, ByVal lpRect As Long, _
        ByVal bErase As Long) As Long
Private Sub DragControl(ctrl As Control)
    Dim startButton As Integer
    Dim startPoint As PointApi
    Dim currPoint As PointApi
    Dim contRect As Rect
    Dim contScaleMode As Integer
    ' get mouse position and buttons pressed
    GetCursorPos startPoint
    If GetAsyncKeyState(vbLeftButton) Then startButton = vbLeftButton
    If GetAsyncKeyState(vbRightButton) Then startButton = startButton Or _
            vbRightButton
    If GetAsyncKeyState(vbMiddleButton) Then startButton = startButton Or _
            vbMiddleButton
    ' get container upper-left corner position
    ' in screen coordinates (currPoint is Zero)
    ClientToScreen ctrl.Container.hwnd, currPoint
    ' get container size
    GetClientRect ctrl.Container.hwnd, contRect
    ' convert to screen coordintes
    contRect.Left = currPoint.x
    contRect.Top = currPoint.y
    contRect.Right = contRect.Right + currPoint.x
    contRect.Bottom = contRect.Bottom + currPoint.y
    ' limit the cursor within the parent control
    ClipCursor contRect
    ' get the ScaleMode that is active for the control
    ' this is the ScaleMode of its container, or it
    ' is vbTwips if its container does not support
    ' the ScaleMode property
    On Error Resume Next
    contScaleMode = vbTwips
    ' ignore next assignement if the container
    ' dows not support ScaleMode property
    contScaleMode = ctrl.Container.ScaleMode
    Do
        ' exit if all mouse buttons are released
        If (startButton And vbLeftButton) = 0 Or
GetAsyncKeyState(vbLeftButton) _
                = 0 Then
            If (startButton And vbRightButton) = 0 Or GetAsyncKeyState _
                    (vbRightButton) = 0 Then
                If (startButton And vbMiddleButton) = 0 Or GetAsyncKeyState
_
                        (vbMiddleButton) = 0 Then
                    Exit Do
                End If
            End If
        End If
        ' get current mouse position
        GetCursorPos currPoint
        ' move the control if they are different
        If currPoint.x <> startPoint.x Or currPoint.y <> startPoint.y Then
            ' move the control
            With ctrl.Parent
                ctrl.Move ctrl.Left + .ScaleX(currPoint.x - startPoint.x, _
                        vbPixels, contScaleMode), ctrl.Top +
.ScaleY(currPoint.y - _
                        startPoint.y, vbPixels, contScaleMode)
                ' refresh container
                InvalidateRectByNum .hwnd, 0, False
                .Refresh
            End With
            ' muovi usercontrollo
           ' MoveUserControl questo pezzo fa parte del mio
            LSet startPoint = currPoint
        End If
        ' allow background processing
        DoEvents
    Loop
    ' restore full mouse movement
    ClipCursorByNum 0
End Sub
quando premo il tasto del mouse sul controllo e lo trascino
funziona bene, il problema è che mi ridisegna o fa il refresh di tutte le
image che ho sul form e poi si blocca per qualche secondo
 sai per caso dirmi da cosa e' dovuto?
ciao e grazie
ilario

 sai per caso dirmi da cosa e' dovuto?
Forse il reponssabile e' quella InvalidateRectByNum che e' un brutto
alias per InvalidateRect (sara', ma a me Balena non e' che piaccia poi
gran che), suppongo per poter passare lo 0 allo scopo di indicare un
puntatore NULL come secondo parametro.
Il guaio e' che se passi NULL allora viene invalidato tutto il
rettangolo della client area e, visto che gli dici di operare con
l'handle della finestra contenitore, ti viene aggiornato tutto il
form.
-- 
ciao, hal


grazie hal
era proprio quello, l'ho tolto insieme al refresh e ora funziona bene
grazie mille
ilario