Newsgroup: it.comp.lang.visual-basic
Titolo: Attivazione al passaggio del mouse...

Per prima cosa SALVE A TUTTI, poi
Domanda:
come devo fare per far cambiare colore ad un frame al passaggio del mouse
!?!
se uso l'evento mousemove riesco a far cambiar colore, ma per poi ritornare
al colore originale !??
e se passo direttamente su uno dei tanti controlli nel frame !??
Grazie in anticipo.

[Matita = 
circa_m...@aliceposta.it
 in
AI41c.51181$
gk.21...@news3.tin.it
] ha fatto cross post, cancello la
risposta che avevo già scritto.




 colore di partenza! :o)
Sarebbe troppo facile...
Se due controlli sono appiccicati?
Oppure appartenenti a un contenitore?
Insomma se per abbandonare un controllo non passi sul form?


usare una API per determinare la posizione assoluta del puntatore e
controllare se è al di fuori del frame?
(se ho detto una ca..ata non arrabbiatevi, sono solo un cattivo dilettante).


 Figurati, GRAZIO LO STESSO


lo farei, ma nel form vi sono altri controlli che devono a loro volta
cambiare colore al passaggio, non solo, ma se con il puntatore esco dal
frame senza passare sopra altri controlli concludo che mi sono puli...
scusate la brutalità...

 Insomma se per abbandonare un controllo non passi sul form?
APPUNTO ... !??? Suggerimenti ?
Eppure oggetti come i pulsanti di explorer riescono a far questo giochino...
...vuoi vedere che non si possa farlo anche con un frame !!???!!
Suvvia...

 APPUNTO ... !??? Suggerimenti ?
A parte il subclassing (che non conosco), non vedo altra possibilità che
gestire l'evento MouseMove di tutti (!) i controlli, form compreso,
chiamando una routine comune. Da qualche parte occorre salvare riferimenti
(nome o oggetto) del controllo precedente e, nel MouseMove che si verifica,
ripristinare il colore del vecchio controllo e assegnarlo al nuovo. Meglio
se con un test per non fare quanto non serve, come, appunto, l'assegnazione
del colore se questo è già stato assegnato.


notifica WM_MOUSEMOVE da windows? in questo caso però forse avresti una
montagna di messaggi da valutare...
oppure un timer non esagerato (tipo qualche volta al secondo) per
controllare la posizione attuale...
PS
qualche linguaggio possiede l'evento MOUSE_LEAVE o qualcosa del genere, l'ho
visto su Factory link (supervisore per automazione industriale)

 Grazie in anticipo.
Di niente...


Assolutamente, anzi fin troppo chiaro.
Eternamente grato.

 ...hai altri preziosi suggerimenti !???
Guarda per quello che serve a te non so che dirti. Il problema sta 
proprio nel fatto che il tuo frame contiene controlli (pulsanti e altro) 
che hanno bisogno di colorarsi al passaggio del mouse.
Io questa tecnica del SetCapture l'ho usata quando ho creato dei miei 
pulsanti personalizzati, quindi quando li inserivo nei miei progetti non 
dovevo controllare che il mouse si trovasse su di essi per illuminarli 
perchè lo facevano loro stessi. Quindi a quel punto, nei tuoi panni, 
avrei pensato semplicemente a controllare il mousemove del frame o un 
SetCapture anche su di esso senza badare tanto ai suoi "figli"... Ma nel 
tuo caso non so che dirti... Mi spiace... Io non veod altra soluzione 
che il subclassing (che non so fare).
A presto!
-- 
Nella vita una sola cosa è certa: se la storia ci ha insegnato qualcosa, 
è che si può uccidere chiunque.
(Michael Corleone)


In realtà l'evento viene generato.


 SetCapture anche su di esso senza badare tanto ai suoi "figli"
Bhe, io ho semplicemente dei checkbox grafici (un array) all'interno del
frame, l'unico problema è che si deve fare un doppio click sul check.
Non è un grosso problema, solo in uno ho anche uno slide, e quello
effettivamente è un po bruttino che funzioni così.
Bhe, non ti scoccio ulteriormente, buona serata.

> In realtà l'evento viene generato.
E allora che problema c'è? Usa il mousedown per i tuoi scopi a questo 
punto. Tanto con il SetCapture hai risolto il problema iniziale.


 punto. Tanto con il SetCapture hai risolto il problema iniziale.
Potreste spiegare, per favore?
Si parlava di "passaggio del mouse", mica di click...

 Si parlava di "passaggio del mouse", mica di click...
E' vero si parlava di passaggio di mouse. Però quando ho suggerito di 
usare SetCapture ho fatto notare che una volta SETTATO il controllo che 
deve ricevere gli spostamenti del mouse ci sono problemi di click.
In effetti se ho una Picturebox chiamata P1, posso fare:
SetCapture P1.hwnd
e tutti gli spostamenti del mouse vengono spediti a P1_MouseMove.
Se faccio click su un commandbutton si genera comunque il P1_MouseDown.
Dopodichè i click successivi sono "normali".
Questo volevo far notare nel thread quando ho suggerito l'utilizzo di 
SetCapture.


 che deve ricevere gli spostamenti del mouse ci sono problemi di click.
Ok, devo aver letto troppo superficialmente io. Grazie.


bhe, il problema č che all'interno del frame ho un array di check, quando
click dovrei nell'evento mouse_down andar a controllare il cursore in che
posizione č richiamare l'evento check_click passndo l'index di dove si trova
il cursore...
...mi sembra un po troppo grezzo come procedimento.
bha, vediamo se mi viene l'ispirazione...

 bha, vediamo se mi viene l'ispirazione...
Ecco, se ti viene, vorresti togliere il cross post? Grazie.


Scusa non volevo arrecare troppo disturbo...
Buona serata a tutti comunque.

 bha, vediamo se mi viene l'ispirazione...
La strada più ostica ma più efficiente secondo me è il subclass.
In un mio progetto ho un array di textbox che ho subclassato e, al 
richiamo della WinProc controllo quale label ha lanciato il messaggio 
(ciclo sull'handle) dopodichè faccio quel che devo..
Questo è uno stralcio di codice:
***************************************************************
Public Function WindowProc(ByVal Hwnd&, ByVal uMsg&, ByVal wParam&, 
ByVal lParam&) As Long
Dim WinProcOld As Long
Dim i As Integer
Dim Index As Long
     'Cerco l'handle nel vettore
     WinProcOld = SubClass.FindWinProcOld(Hwnd)
     If WinProcOld = 0 Then
         WindowProc = DefWindowProc(Hwnd, uMsg, wParam, lParam)
         Exit Function
     End If
         Case WM_MOUSEMOVE
             'Cerco l'handle della textbox che ha generato il messaggio
             For i = 0 To frmMenu.txtMenu.Count - 1
                 If Hwnd = frmMenu.txtMenu(i).Hwnd Then
                     'Il messaggio arriva da una textbox del form menu
                     TrackingMouse Hwnd
                     WindowProc = DefWindowProc(Hwnd, uMsg, wParam, lParam)
                     Exit Function
                 End If
             Next
         Case WM_MOUSELEAVE
             'Cerco l'handle della textbox che ha generato il messaggio
             For i = 0 To frmMenu.txtMenu.Count - 1
                 If Hwnd = frmMenu.txtMenu(i).Hwnd Then
                     'Il messaggio arriva da una label del form menu
                     frmMenu.txtMenu(i).Font.Underline = False
                     frmMenu.txtMenu(i).ForeColor = &HC00000
                     frmMenu.ImgMenu(i).BorderStyle = 0
                     WindowProc = DefWindowProc(Hwnd, uMsg, wParam, lParam)
                     Exit Function
                 End If
             Next
         Case WM_MOUSEHOVER
             'Cerco l'handle della textbox che ha generato il messaggio
             For i = 0 To frmMenu.txtMenu.Count - 1
                 If Hwnd = frmMenu.txtMenu(i).Hwnd Then
                     'Il messaggio arriva da una label del form menu
                     frmMenu.txtMenu(i).Font.Underline = True
                     frmMenu.txtMenu(i).ForeColor = &HC0&
                     frmMenu.ImgMenu(i).BorderStyle = 1
                     WindowProc = DefWindowProc(Hwnd, uMsg, wParam, lParam)
                     Exit Function
                 End If
             Next
     End Select
     WindowProc = CallWindowProc(WinProcOld, Hwnd, uMsg, wParam, lParam)
     Exit Function
***************************************************************
Ciao!