Newsgroup: it.comp.lang.visual-basic
Titolo: [? USER CONTROL] Settare top e left

Ciao a tutti
Sto realizzando un piccolo usercontrol (senza tante pretese) che mi serve
per fare da contenitore ad altri controlli. In pratica simulo una
finestrella (sono riuscito a disegnarne il bordo, la caption ...). Sono
riuscito a renderlo anche ridimensionabile così l'utente può ingrandire e
rimpicciolire il controllo come una vera e propria finestra.
Il problema sta nel renderlo spostabile.
Nel senso che ora devo implementare il fatto che se uno clicca nella caption
deve avere la possibilità di spostare dove vuole il controllo stesso
rispetto il suo contenitore.
Ho cercato in MSDN e in giro per vari siti, ma non ho trovato nulla... :(
Sembra infatti che uno usercontrol non abbia le proprietà top e left (solo
scaletop e scaleleft ma non fanno un baffo visto che sono sempre a 0) quindi
come faccio ad impostarne la posizione dell' ancolo superiore destro?
Naturalmente l'oggetto contenitore del mio usercontrol può farlo, ma sempre
naturalmente non è la strada giusta.
Qualche idea?
Thanks
SebaMix

 ha scritto nel messaggio
news:a50gab$3pjbi$1...@ID-66833.news.dfncis.de...
| Ciao a tutti
| Sto realizzando un piccolo usercontrol (senza tante pretese) che mi serve
| per fare da contenitore ad altri controlli. In pratica simulo una
| finestrella (sono riuscito a disegnarne il bordo, la caption ...). Sono
| riuscito a renderlo anche ridimensionabile così l'utente può ingrandire e
| rimpicciolire il controllo come una vera e propria finestra.
| Il problema sta nel renderlo spostabile.
| Nel senso che ora devo implementare il fatto che se uno clicca nella
caption
| deve avere la possibilità di spostare dove vuole il controllo stesso
| rispetto il suo contenitore.
| Qualche idea?
come strada e' brutta ma credo vada:
l'idea e' chiamare una routine esposta dall'ocx che
non faccia altro che trovare l'oggetto stesso.
prendi il riferimento e lo setti a una var public.
Ora sai esattamente dove cavolo si trova anche
dall'interno del ocx... e quindi la sua left e la sua
top.
public mvarMe As object '--oggetto referenziato a se stesso
Private Sub TrovaTeStesso()
    '--routine che cerca se stesso nel form
    Dim i As Long
    Dim Myhwnd As Long
    Myhwnd = UserControl.Hwnd
    For i = 0 To UserControl.ParentControls.Count - 1
        If TypeOf UserControl.ParentControls.Item(i) Is OGGETTOOCX Then
            If UserControl.ParentControls.Item(i).Hwnd = Myhwnd Then
                '--ho trovato me stesso! ora setto un oggetto = a me!
                '  così posso usare lui per le misure
                Set mvarMe = UserControl.ParentControls.Item(i)
                Exit For
            End If
        End If
    Next
End Sub
non ho provato ma credo va...
se ho proprio cannato cio' che volevi scusa
ma oggi proprio non ci sto dentro :(


Suppongo
Private Declare Function SetWindowPos Lib "user32" _
        (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
        ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
        ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const SWP_NOOWNERZORDER = &H200      '  Don't do owner Z ordering
Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, x As
Single, y As Single)
    Static Called As Boolean
    If Called Then
        Called = False
    Else
        If Button And vbLeftButton Then
            'Debug.Print x, y
            Called = True
            Debug.Print CLng(x / Screen.TwipsPerPixelX), _
                    CLng(y / Screen.TwipsPerPixelY)
            SetWindowPos UserControl.hwnd, 0, _
                    (x / Screen.TwipsPerPixelX), _
                    (y / Screen.TwipsPerPixelY), _
                    (UserControl.Width / Screen.TwipsPerPixelX), _
                    (UserControl.Height / Screen.TwipsPerPixelY), _
                    SWP_NOOWNERZORDER
            UserControl.Parent.Refresh
        End If
    End If
End Sub
Ma e' da smanettarci un attimo perche' si comporta in modo un po' strano.
HTH,
*

>             If UserControl.ParentControls.Item(i).Hwnd = Myhwnd Then
Mi dice proprietà o metodo non supportati dall' oggetto... :(

 ha scritto nel messaggio
news:a50m1g$3qoq4$1...@ID-66833.news.dfncis.de...
| >             If UserControl.ParentControls.Item(i).Hwnd = Myhwnd Then
|
| Mi dice proprietà o metodo non supportati dall' oggetto... :(
ammesso che la cosa che ho scritto non abbia errori
di sintassi vorrei sapere dove l'hai buttata?
sull'oggetto ocx, giusto?
ma si cricca sul primo oggetto o esiste qualcosa
(ma non credo) che non ha un hwnd?
cmq il post di *alessandro* mi sembra + fico senza
la cosa contorta che e' venuta in mente sul momento
a me :)

 a me :)
:)
Ha un paio di effettucci collaterali ma penso che smanettandoci un po' lo
farò andare
CiaoZ
SebaMix

 ha scritto nel messaggio
news:a50m1g$3qoq4$1...@ID-66833.news.dfncis.de...


 come faccio ad impostarne la posizione dell' ancolo superiore destro?
[...]


A chi lo dici (versione API):
Option Explicit
Public Event MouseMove(Button As Integer, Shift As Integer, x As Single, y
As Single)
Private IsMouseDown As Boolean
Private FirstP As POINTAPI
Private FirstRect As RECT
Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, x As
Single, y As Single)
    If Button = vbLeftButton And Not IsMouseDown Then
        Call GetWindowRect(UserControl.hwnd, FirstRect)
        GetCursorPos FirstP
        IsMouseDown = True
    End If
End Sub
Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, x As
Single, y As Single)
    Static Called As Boolean
    Dim OrigX As Long, DeltaX As Long
    Dim OrigY As Long, DeltaY As Long
    Dim r As RECT
    Dim p As POINTAPI
    Dim l As Long
    If Button = vbLeftButton Then
        GetCursorPos p
        GetWindowRect UserControl.Parent.hwnd, r
        ' Le costanti usate sotto vanno sostituite con
        ' opportune chiamate alla GetSystemMetrics per
        ' ottenere i valori corretti delle dimensioni
        ' dei bordi secondo lo stile della finestra parent.
        ' Possibili chiamate:
        ' SM_CYCAPTION
        ' SM_CXSIZEFRAME, SM_CYSIZEFRAME
        ' SM_CXFIXEDFRAME, SM_CYFIXEDFRAME
        ' SM_CXBORDER, SM_CYBORDER
        OrigX = FirstRect.Left - r.Left - 3 ' Sostituire il 3
        OrigY = FirstRect.Top - r.Top - 23 ' Sostituire il 23
        DeltaX = p.x - FirstP.x
        DeltaY = p.y - FirstP.y
        MoveWindow UserControl.hwnd, _
                OrigX + DeltaX, _
                OrigY + DeltaY, _
                (UserControl.Width / Screen.TwipsPerPixelX), _
                (UserControl.Height / Screen.TwipsPerPixelY), _
                True
    Else
        IsMouseDown = False
    End If
End Sub
Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, x As
Single, y As Single)
    If Button = vbLeftButton Then
        IsMouseDown = False
    End If
End Sub
Ciaotutti,
*


Questo evento e' roba vecchia che puo' essere rimossa, per inciso...
Ciaotutti,
*

 For i = 0 To UserControl.ParentControls.Count - 1
Guarda che basta usare il metodo Extender. Prova a usare
Usercontrol.Extender.Left e Usercontrol.Extender.Right
Extender deve essere usato per tutte quelle proprietą che non sono
conosciute dal controllo, ma dal suo container (left e top per esempio, ma
si usa anche per arrivare al container stesso).
Ciao
*Roby*