Newsgroup: it.comp.lang.visual-basic
Titolo: estendere controlli

Cioa a tutti ho unadomandine da porvi.
Vorrei estendere le funzionalità di controlli come le label e vorrei sapere
se c'è un modo semplice come in Delphi per esempio in cui si sfrutta
l'ereditarietà. In particolare avrei bisogno che una label si colori
diversamente al passaggio del mouse, aggiungere insomma OnMouseOver e
OnMouseOut. Ho cercato di sruttare il metodo OnMouseMove ma se construisco
un controllo user_control (delle stesse dimensioni della label che ci metto)
e ci metto dentro una label, verrà chiamata solo la OnMouseMove della label,
impedendomi di capire quando generare la OnMouseOut. Come posso fare?
Spero di essere stato chiaro
ciao, Giuseppe

 ciao, Giuseppe
ciaociao


Ma se sono fuori dalla label ,l'evento non scatta.. giusto?
Giuseppe

 Giuseppe
ciaociao

 vuol dire che sei all'interno. Capito?
Immagino che Giuseppe volesse gestire l'evento di 'uscita' dalla label, non
il fatto di essere fuori.
Siccome il mousemove avviene solo sul doevents o in idle, è del tutto
possibile (soprattutto se lo si sta tenendo monitorato) che non scatti
esattamente nel momento in cui si passa sul bordino. Oltre a ciò, se premo
alt+tabe  passo ad un'altra app, poi sposto il pointer e poi rientro
nell'app originale, il mouse è fuori e io ho perso l'evento.
Diciamo che al primo problema si potrebbe porre rimedio facendo si che lo
UserControl sia un filo più grande della label contenuta, per cui il
mousemove sullo usercontrol ma non sulla label significherebbe uscita. Non
si ha la certezza, ma quasi.
Sul secondo caso invece occorrerebbe anche gestire il lostfocus (o altro
evento di 'nascondimento', bisogna sbirciare un po' l'object model) dello
usercontrol.
Ciao
Alberto


Esattamente, volgio che la label sia chessò nera in condizioni normali e
rossa quando ci passo sopra, quindi una volta uscito dalla label devo avere
un evento OnMouseOut. Il trucco di ingrandire l'user_control non funziona
benissimo, infatti allontanando velocemente il mouse la label rimane rossa.
Mi sembra assurdo che due eventi così semplici sono siano gestiti in modo
nativo dai controlli...
Grazie ad entrambi
Giuseppe

 controlli...
Purtroppo e' cosi'; per queste cose, come pure l'ereditarieta' che
menzionavi nel primo messaggio, devi rivolgerti a 
VB.NET
In VB6 esiste una soluzione abbastanza semplice, ecco una FAQ postata da
Zanna tempo fa:
Private Declare Function GetCapture Lib "user32" () As Long
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As
Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Enum MouseOverEvents
    moInto = 0
    moEnter = 1
    moExit = 2
End Enum
Function MouseOver(Ctrl As Control _
            , ByVal X As Single, ByVal Y As Single) As MouseOverEvents
If (GetCapture <> Ctrl.hwnd) Then
    Call SetCapture(Ctrl.hwnd)
    MouseOver = moEnter
Else
    If ((X < 0 Or X > Ctrl.Width) Or (Y < 0 Or Y > Ctrl.Height)) Then
        Call ReleaseCapture
        MouseOver = moExit
    Else
        MouseOver = moInto
    End If
End If
End Function
Private Sub TuoControllo_MouseMove(Button As Integer _
                        , Shift As Integer, X As Single, Y As Single)
Select Case MouseOver(TuoControllo, X, Y)
Case moExit
    Debug.Print "Uscito"
Case moEnter
    Debug.Print "Entrato"
Case moInto
    Debug.Print "Dentro"
End Select
End Sub
C'e' purtroppo una limitazione: e' applicabile soltanto a controlli "veri",
cioe' a controlli dotati di un handle, cosa che Label Shape e Line non hanno
(sono a tutti gli effetti dei "print" fatti direttamente sulla form, che il
designer di VB camuffa da controlli)
Non puoi quindi usarlo direttamente con la tua Label, ma puoi invece
incorporarlo nello UserControl che invece puoi dotare di handle.
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Zanna tempo fa:
Grazie mille per avermela ripostata. Provo ad usarla.
Giuseppe