Newsgroup: it.comp.lang.visual-basic
Titolo: UserControl e ScaleLeft

Ragazzi proprio non ci riesco!!! Non riesco a capire da cosa dipenda.
Sto creando un usercontrol che, posizionato sulla form, disegni su se stesso
quello che c'è sulla form alle sue coordinate (praticamente sotto di lui).
La proprietà UserControl.Scaleleft (usata nel codice del controllo utente
stesso) mi restituisce sempre 0.
Come faccio a sapere la coordinata x e la coordinata y del mio oggetto dal
suo interno?
Grazie a tutti.
--
"La matematica è l'alfabeto con il quale DIO ha scritto l'Universo"
(G. Galilei)

 quello che c'è sulla form alle sue coordinate (praticamente sotto di lui).
Se devi rendere il tuo UserControl trasparente perchp non setti
BackStyle = vbTransparent
?
Ciao

 suo interno?
prima devi farlo sparire per copiare :))
usercontrol.visible=false
copia form
usercontrol.visible=true
ciao

 usercontrol.visible=true
Ho risolto con PaintPicture, che va alla grande.
Ma come faccio a sapere le coordinate di posizione?


 BackStyle = vbTransparent
Non devo renderlo trasparente. Mi serve per fare un effetto di semi
trasparenza, nel senso che nel punto in cui posizionerò il mio controllo si
dovrà vedere l'immagine della form leggermente oscurata, come se il mio
controllo fosse uno strato di vetro oscuro. Quindi inizialmente mi sto
esercitando con un semplice PaintPicture, solo che dal mio controllo non
riesco a sapere in che zona della form il controllo stesso si trova.

 suo interno?
UserControl.Extender.Top
UserControl.Extender.Left

 Ma come faccio a sapere le coordinate di posizione?
Le coordinate che cerchi sono quelle che sono assegnate allo usercontrol dal
contenitore.
Devi quindi 'metterti in collegamento' con il container, sfruttando la
proprietą Extender dello usercontrol.
Poi, a seconda del contenitore del tuo controllo, alcune proprietą saranno
disponibili o meno, vedi tu su MSDN.
Ciao
Alberto

 Ma come faccio a sapere le coordinate di posizione?
Prova diversamente: sovrapporre il tuo controllo al form
(contiene anche la risposta alla tua domanda):
Option Explicit
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x
As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal
hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long)
As Long
Private Declare Function ClientToScreen Lib "user32" (ByVal hWnd As Long,
lpPoint As POINTAPI) As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long,
lpPoint As POINTAPI) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long,
lpRect As RECT) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal
hDC As Long) As Long
Private Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As
Long
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Type POINTAPI
    x As Long
    y As Long
End Type
Private Const SRCPAINT = &HEE0086
Private Sub UserControl_Initialize()
    BackStyle = vbTransparent
End Sub
Public Sub Paint()
    Dim p As POINTAPI
    Dim r As RECT
    Dim hDC As Long
    hDC = GetWindowDC(Parent.hWnd)
    Call GetWindowRect(hWnd, r) ' << coordinate schermo del tuo controllo
    p.x = r.Left
    p.y = r.Top
    Call ScreenToClient(Parent.hWnd, p) '<< converte coordinate schermo in
coordinate client
    Call BitBlt(hDC, p.x, p.y, r.Right + p.x, r.Bottom + p.y,
UserControl.hDC, 0&, 0&, SRCPAINT)
    Call ReleaseDC(Parent.hWnd, hDC)
End Sub
Poi richiami dal form
Usercontrol11.Paint
Ciao